如何在查询中过滤继承实体对象的特定子类型上的某些条件?

时间:2011-01-17 22:41:32

标签: entity-framework entity-framework-4

我的SQL 2008数据库中有三个表:User,CutomerUser和SalesUser。它们代表不同类型的用户。在我的概念模型中,这些模型被建模,以便CustomerUser和SalesUser实体从User继承。在数据库级别,CustomerUser和SalesUser的主键同时是用户的外键。因此,这种关系是一到零或一。

CustomerUser表具有CustomerNumber列,SalesUser表具有RepresentativeCode列。我想写一个查询,根据选择标准返回任何Users,CustomerUsers或SalesUsers。请注意,有些用户既不是CustomerUsers也不是SalesUsers。

我希望不返回所有登录等于指定字符串的用户,无论其类型如何。另外,如果一个CustomerUser的客户编号等于我想要返回的指定字符串,并且我想要返回代表性代码等于指定字符串的SalesUsers。

我写了以下查询:

var users = from u in Context.Users
where (((u is CustomerUser) &&  ((CustomerUser)u).CustomerNumber.Equals(criteria))
|| ((u is SalesUser) && ((SalesUser)u).RepresentativeCode.Equals(criteria)))
|| u.Login.Equals(criteria) 
select u;

查询编译,但在运行时执行查询时,会抛出以下异常:

“无法将类型'MyDb.Models.User'强制转换为'MyDb.Models.CustomerUser'.LINQ to Entities仅支持转换实体数据模型基元类型。”

如何编写查询以使其有效?

注意:我将对管道中的查询应用排序/分页,因此在此处执行ToList()然后转换类型的解决方案对我不起作用。

1 个答案:

答案 0 :(得分:1)

你必须使用as强制转换。您还可以利用L2E合并空值的事实:

var users = from u in Context.Users
            let customerNumber = (u as CustomerUser).CustomerNumber
            let representativeCode = (u as SalesUser).RepresentativeCode
            where customerNumber.Equals(criteria)
                  || representativeCode.Equals(criteria)
                  || u.Login.Equals(criteria)
            select u;