我的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()然后转换类型的解决方案对我不起作用。
答案 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;