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对象发送到客户端。因此,我最终将从一个展平的对象重新创建层次结构。