Entity framework 4 实体框架:对派生类型的字段进行排序

Entity framework 4 实体框架:对派生类型的字段进行排序,entity-framework-4,Entity Framework 4,我很确定我不能做我想在EF4.3中做的事情,但是在我放弃尝试之前,我想我应该让一些更有经验的程序员来运行它 我有一个模式,其中有两个实体类型“person”和“org”,每一个都派生自我称之为“named”的根实体。此结构允许我通过多对多关系“实体\地址”将“命名”实体的实例与另一个名为“地址”实体的实例相关联,而无需区分“命名”实体是组织还是个人 当我查询实体地址时,我希望能够根据实体地址实例是“个人”还是“组织”按不同属性对结果进行排序。对于个人,排序算法的“输入”可能是属性“last_na

我很确定我不能做我想在EF4.3中做的事情,但是在我放弃尝试之前,我想我应该让一些更有经验的程序员来运行它

我有一个模式,其中有两个实体类型“person”和“org”,每一个都派生自我称之为“named”的根实体。此结构允许我通过多对多关系“实体\地址”将“命名”实体的实例与另一个名为“地址”实体的实例相关联,而无需区分“命名”实体是组织还是个人

当我查询实体地址时,我希望能够根据实体地址实例是“个人”还是“组织”按不同属性对结果进行排序。对于个人,排序算法的“输入”可能是属性“last_name”的值,而对于组织,则可能是属性“org_name”

如果我尝试显而易见的方法:

IQueryable<named> sorted = entities.OrderBy(x => ( x is person ) ? ( (person) x ).last_name : ( (org) x ).org_name);
IQueryable sorted=entities.OrderBy(x=>(x是个人)?((个人)x).姓氏:((组织)x).org\u名称);
当我访问“排序”时,EF抛出一个关于只能强制转换基元类型的异常。我假定它不能将cast操作符应用于“x”实例

我尝试了很多不太明显的方法,但没有成功:)

在LINQtoEntities中是否有这样做的方法


我知道我可以通过对数据库进行非规范化并在实体“named”中粘贴一个“sort_字段”来解决这个问题,然后仅对其进行排序(我必须包含逻辑,以使sort_字段值与person和org实例中的值的更改保持一致,但这肯定是可行的)。

这行吗?我假设
实体
是名为的
的集合


entities.OrderBy(x=>x as person==null?x.org\u name:x.last\u name)

这有效吗?我假设
实体
是名为
的集合


entities.OrderBy(x=>x as person==null?x.org\u name:x.last\u name)
实现所需的一种方法是将两个实体投影到相同(匿名)类型:

entities.OfType()
.Select(p=>new{p.Prop1,p.Prop2,…,SortProp=p.last_name})
.工会(
类型()的实体
.Select(o=>new{o.Prop1,o.Prop2,…,SortProp=o.org_name}))
.OrderBy(x=>x.SortProp)
投影应具有相同顺序的完全相同的属性


当然,您也可以像以前一样在内存中进行排序,即在
entities.ToList()
上进行排序。但这违背了使用
IQueryable
:让数据库完成工作的目的。

实现所需的一种方法是将两个实体投影到相同(匿名)类型:

entities.OfType()
.Select(p=>new{p.Prop1,p.Prop2,…,SortProp=p.last_name})
.工会(
类型()的实体
.Select(o=>new{o.Prop1,o.Prop2,…,SortProp=o.org_name}))
.OrderBy(x=>x.SortProp)
投影应具有相同顺序的完全相同的属性


当然,您也可以像以前一样在内存中进行排序,即在
entities.ToList()
上进行排序。但这与使用
IQueryable
:让数据库完成工作的目的背道而驰。

FWIW,我还意识到,我可以使用我在概念模型中输入的自定义函数,在测试指定实例的实体类型后检索适当的文本字段。不过,我很好奇,是否有一种不用编写自定义函数(即在Linq中“直接”到实体)的方法。FWIW,我还意识到,我可以在测试给定的命名实体实例的实体类型后,使用放入概念模型中的自定义函数来检索适当的文本字段。不过,我很好奇,是否有一种方法可以不用编写自定义函数(例如,在Linq中“直接”写入实体)就可以实现这一点。对不起,Josh,这不起作用,因为“named”既不包含组织名也不包含姓氏作为属性。这些分别是“org”和“person”的属性。对不起,Josh,但这不起作用,因为“named”不包含组织名或姓氏作为属性。这些分别是“org”和“person”的属性。非常好,谢谢!Gert,我不得不稍微修改一下你的想法,因为“org”和“person”不共享同一组属性,但这很简单。该解决方案无法与我构建的系统的其余部分协同工作,但这不是该解决方案的缺陷——只是我没有描述该解决方案必须符合的所有规范。但就我提出的具体问题而言,这绝对是中肯的。太好了,谢谢!Gert,我不得不稍微修改一下你的想法,因为“org”和“person”不共享同一组属性,但这很简单。该解决方案无法与我构建的系统的其余部分协同工作,但这不是该解决方案的缺陷——只是我没有描述该解决方案必须符合的所有规范。但就我提出的具体问题而言,这肯定是中肯的。