C# 实体框架4和Linq:OrderBy嵌套在查询中的字段:重构我的代码
首先,我们有一个很好的解决方案,可以对相关表中的字段进行排序,其中关系可能并不总是存在:C# 实体框架4和Linq:OrderBy嵌套在查询中的字段:重构我的代码,c#,entity-framework-4,sql-order-by,C#,Entity Framework 4,Sql Order By,首先,我们有一个很好的解决方案,可以对相关表中的字段进行排序,其中关系可能并不总是存在: userQuery = userQuery.OrderBy(u => (u.Department != null) ? u.Department.Name : String.Empty); 我需要做同样的事情。我的总根是巨大的: myQuery = myQuery.OrderBy(p => (p.Seconds == null ? 0 : p.Seconds.Fi
userQuery = userQuery.OrderBy(u =>
(u.Department != null) ? u.Department.Name : String.Empty);
我需要做同样的事情。我的总根是巨大的:
myQuery = myQuery.OrderBy(p =>
(p.Seconds == null
? 0
: p.Seconds.FirstOrDefault() == null
? 0
: p.Seconds.First().Thirds == null
? 0
: p.Seconds.First().Thirds.FirstOrDefault() == null
? 0
: p.Seconds.First().Thirds.First().Forths == null
? 0
: p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null
? 0
: p.Seconds.First().Thirds.First().Forths.First().myField));
这真的是这样做的吗,还是有更容易阅读的东西?我的另一个问题是嵌套的myField在顶级查询中有一个匹配的“default”值,也称为myField。这个想法是通过这两个领域的结合来排序(??)
编辑:我认为这将包括第一个字段中的“默认值”:
myQuery = myQuery.OrderBy(p =>
(p.Seconds == null
? p.myDefaultField // Used to be zero
: p.Seconds.FirstOrDefault() == null
? p.myDefaultField
: p.Seconds.First().Thirds == null
? p.myDefaultField
: p.Seconds.First().Thirds.FirstOrDefault() == null
? p.myDefaultField
: p.Seconds.First().Thirds.First().Forths == null
? p.myDefaultField
: p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null
? p.myDefaultField
: p.Seconds.First().Thirds.First().Forths.First().myField));
如何将此OrderBy重写为更干净?此代码失败,错误为“无法比较System.Collections.Generic.IEnumerable`1”类型的元素。仅支持基本类型(如Int32、字符串和Guid)和实体类型。“我认为您在这里有一种非常难闻的代码味道,但是,如果使用您所拥有的,我不会在这样的LINQ查询中处理这个问题。为了便于阅读,我会做如下的事情
myQuery = myQuery.OrderBy(p =>
(p.HasValidFields()
? p.Seconds.First().Thirds.First().Forths.First().myField
: p.myDefaultField
));
在p的课堂里
private bool HasValidFields
{
get
{
return p.Seconds != null &&
p.Seconds.FirstOrDefault() != null &&
.... ;
}
}
也许你应该在别的地方解决这个问题。您确定需要浏览四个关系吗?您不能更改数据库和/或映射,以便以更合适的格式获取数据吗?我始终可以添加视图和/或存储过程,但最终结果是将一个层次化JSON对象发送到客户端。因此,我最终将从一个展平的对象重新创建层次结构。