不能在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#的新手,我认为这是一个编译问题,因为我知道RelatedObject
是TypeB
。谢谢!
显然,实体框架并不(足够)了解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);