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

时间:2012-07-18 16:59:46

标签: entity-framework-4

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

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

当我查询entity_address时,我希望能够根据entity_address实例是'person'还是'org',按不同的属性对结果进行排序。对于人而言,排序算法的“输入”可能是属性“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中执行此操作?

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

2 个答案:

答案 0 :(得分:0)

这有用吗?我假设entitiesnamed ...

的集合

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

答案 1 :(得分: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)

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

当然,你也可以按照你已经做过的方式在内存中进行排序,即在entities.ToList()上。但这违背了使用IQueryable执行此操作的目的:让数据库完成工作。