2

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

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

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

如果我尝试明显:

IQueryable<named> sorted = entities.OrderBy(x => ( x is person ) ? ( (person) x ).last_name : ( (org) x ).org_name);

当我访问“排序”时,EF 会抛出一个关于只能转换原始类型的异常。我认为它不能将强制转换运算符应用于“x”实例。

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

有没有办法在 LINQ to Entities 中做到这一点?

我知道我可以通过非规范化数据库并在实体“命名”中粘贴一个“sort_field”来解决问题,然后对其进行排序(我必须包含使 sort_field 值与实例中的值更改保持一致的逻辑个人和组织,但这当然是可行的)。

4

2 回答 2

0

这行得通吗?我假设这entities是一个集合named...

entities.OrderBy(x => x as person == null ? x.org_name : x.last_name)

于 2012-07-18T17:28:47.140 回答
0

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

entities.OfType<Person>()
    .Select(p => new { p.Prop1, p.Prop2, ..., SortProp = p.last_name })
.Union(
    entities.OfType<Organization>()
        .Select(o => new { o.Prop1, o.Prop2, ..., SortProp = o.org_name }))
.OrderBy(x => x.SortProp)

投影应该以相同的顺序具有完全相同的属性。

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

于 2012-07-18T19:16:53.483 回答