不能在LINQ中使用IQueryable进行强制类型转换

本文关键字:类型转换 IQueryable LINQ 不能 | 更新日期: 2023-09-27 18:07:51

我想知道如何让下面的查询工作:

IQueryable<TypeA> data  = ...;                  
data = data.OrderBy(x => ((TypeB)x.RelatedObject).Value);
我得到的错误是:

指定的类型成员'RelatedObject'在LINQ to中不支持实体。只有初始化式、实体成员和实体导航

我是c#的新手,我认为这是一个编译问题,因为我知道RelatedObjectTypeB。谢谢!

不能在LINQ中使用IQueryable进行强制类型转换

显然,实体框架并不(足够)了解TypeA和TypeB之间的关系。如果你能把它定义为一个导航属性,那就解决了你的问题。

如果不可能,插入.AsEnumerable()应该工作:

data.AsEnumerable().OrderBy(x => ((TypeB)x.RelatedObject).Value);

这将做的是,让'正常' LINQ执行排序,而不是数据库(在SQL查询中使用ORDER BY子句)。请注意,它返回IEnumerable<TypeA>而不是IQueryable<TypeA>—这取决于您对该变量的处理,这可能会导致将更多的记录加载到内存中,而不是严格必要的记录。

如果你知道你只得到一个特定的类型,你应该能够做这样的事情,假设EF知道继承。

IQueryable<TypeA> data  = ...;                  
data = data.OfType<TypeB>().OrderBy(x => (x.RelatedObject).Value);