Полиморфный запрос EF4 CTP5

У меня есть следующая модель:

public class Employee
{
    public Employee()
    {
        TimeCards = new List<TimeCard>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime HireDate { get; set; }
    public virtual ICollection<TimeCard> TimeCards { get; set; }
}
public class Manager : Employee
{
    public bool HasCompanyCar { get; set; }
}
public class Developer : Employee
{
    public string MainProgrammingLanguage { get; set; }
}

(Я использую эту инфраструктуру, если это важно ).

Что мне нужно, так это получить всех сотрудников, которые не являются менеджерами. Есть только метод расширения OfType. Мне нужно NotOfType.

    var employees = unitOfWork.Employees
                   .FindAll()
                   .NotOfType<Manager>(); //or something similar
    var cards = unitOfWork.TimeCards.FindAll();

    var query = from e in employees
                from tc in cards
                where tc.Employee.Id == e.Id && e.Name.StartsWith("C")
                select tc;

Не по теме: является ли наследование правильным выбором для таких ситуаций? Как вы его моделируете? Я просто чувствую, что наследование ведет меня по ложному пути.


person Cosmin Onea    schedule 23.01.2011    source источник


Ответы (1)


Возможно, вы обнаружите, что метод расширения NotOfType должен быть лучше, но это должно сработать для вас.

var employees = unitOfWork.Employees
               .Where(e => !(e is Manager));

var cards = unitOfWork.TimeCards.FindAll();

var query = from e in employees
            from tc in cards
            where 
               tc.Employee.Id == e.Id && 
               e.Name.StartsWith("C")                   
            select tc;

Или вот так:

var employees = unitOfWork.Employees
               .FindAll();

var cards = unitOfWork.TimeCards.FindAll();

var query = from e in employees
            from tc in cards
            where 
               tc.Employee.Id == e.Id && 
               !(e is Manager) &&
               e.Name.StartsWith("C")                   
            select tc;
person Ramón García-Pérez    schedule 29.01.2011