1

我有类似下面的模式: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; } 
} 

(我使用this infrastructure如果它是很重要的)。

我需要的是让所有不是经理的雇员。只有一个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; 

题外话:继承是这种情况下的正确选择吗?你如何建模?我只是觉得继承让我走错了路。

回答

0

也许你会发现,一个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;