实体框架:按子类型的属性筛选查询

时间:2017-10-30 11:03:26

标签: c# entity-framework children

我的模型如下

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
}

class Employee : Person
{
    public string Dep { get; set; }
}

class Client : Person
{
    public string Type { get; set; }
}

现在,我想通过Person的属性查询Employee,如下所示

context.Set<Person>().Where(x => ((Employee)x).Dep == "dep").ToList();

但是我收到以下错误

  

无法投放类型&#39; DomainModel.Person&#39;输入   &#39; DomainModel.Employee&#39 ;. LINQ to Entities仅支持转换EDM   原始或枚举类型。

我知道我可以简单地使用

context.Set<Employee>().Where(x => x.Dep == "dep").ToList();

但问题是我使用通用搜索控件,该控件只能处理一种搜索类型,搜索条件会传递给该控件,因为确定类型的lambda表达式和搜索语句也会返回将控件搜索为lambda表达式,然后将其作为谓词传递给Where方法,现在我想使用此搜索控件同时搜索EmployeePerson,并且因为搜索控件只能处理我传递父类型的一种类型Person,以便我可以在搜索中访问其所有子类型属性,但我遇到了上面提到的问题。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

在EF继承方面,LINQ to Entities查询不支持cast运算符。但是,isas运算符完全受支持,因此编写此类过滤器的正确方法如下:

context.Set<Person>()
    .Where(x => x is Employee && (x as Employee).Dep == "dep")
    .ToList();