c# - Entity Framework 4 和 Linq : OrderBy a field nested in a Query : refactor my code

标签 c# entity-framework-4 sql-order-by

首先,Thomas Levesque对于关系可能并不总是存在的相关表中的字段排序有一个很好的解决方案:

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 在顶级查询中有一个匹配的“默认”值,也由 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、String 和 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 &&
           .... ;
  }
}

关于c# - Entity Framework 4 和 Linq : OrderBy a field nested in a Query : refactor my code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4242487/

相关文章:

c# - 如何在 C# 中处理多播委托(delegate)中的异常?

c# - 想在WP7的外部浏览器中打开链接

c# - .NET Native 比使用 ReadAsync 调用的调试构建慢得多

c# - 阅读 app.config 很昂贵吗?

c# - Entity Framework 按实体类型分组

PHP 初学者 : How to "Order by" that query?

mysql - Symfony3-学说 : Order by Case When

java - ORDER BY 使用 Criteria API

asp.net-mvc - Entity Framework 代码优先多对多 NullReference

nhibernate - 我是否应该担心默认情况下ORM返回所有列?