我很确定我不能在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值与更改一致的逻辑)在人和组织的实例中的值,但这当然是可行的。)
答案 0 :(得分:0)
这有用吗?我假设entities
是named
...
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
执行此操作的目的:让数据库完成工作。