【问题标题】:LinQ Aggregate Error - Sequence contains no elementsLinQ 聚合错误 - 序列不包含任何元素
【发布时间】:2016-06-16 10:52:01
【问题描述】:

请帮帮我。我有一个带有许多过滤条件的 LinQ 查询。

以下是我的查询:

var Aggregate = linqkb.Where(s => s.Status.Equals("Approved")).Select(s => s.Approver)
    .Distinct()
    .Aggregate((i, j) => i + ";" + j)
    .Split(';')
    .Distinct();

在某些情况下,我收到错误:

Error Message : Sequence contains no elements
Stack Trace   : at System.Linq.Enumerable.Aggregate[TSource](IEnumerable`1 source, Func`3 func)

我是 linQ 的新手。请建议。

我在Aggregator 之前用谷歌搜索并尝试过使用**.DefaultIfEmpty()**,如下所示:

var Aggregate = linqkb.Where(s => s.Status.Equals("Approved")).Select(s => s.Approver)
    .Distinct()
    .DefaultIfEmpty()
    .Aggregate((i, j) => i + ";" + j)
    .Split(';')
    .Distinct();

但这不起作用。

有什么建议吗?

【问题讨论】:

  • 什么是linqkb,这个序列中的元素是什么类型?
  • 可以尝试拆分调用,调试中间结果。 Status = "Approved" 可能没有元素。 DefaultIfEmpty 只提供了另一个空序列 afaik。
  • 你为什么加入";"只是为了在下一行再次拆分它?最简单的异常修复方法是为Aggregate 提供一个初始值,即Aggregate("", (i, j) => i + ";" + j)

标签: c# linq aggregate sequence


【解决方案1】:

Aggregate 如果没有提供,则使用序列中的第一项作为累加器。如果序列中没有项目,则无法执行此操作,因此在这种情况下会引发异常。您可以提供一个明确的初始值,即

.Aggregate(string.Empty, (i, j) => i + ";" + j)

请注意,这种连接字符串的方法效率低下,并且会产生大量中间垃圾。您可以使用string.Join,但不清楚为什么您会立即在下一行的";" 上拆分结果。

【讨论】:

    【解决方案2】:

    问题的直接解决方法如下:

    var Aggregate = linqkb
        .Where(s => s.Status.Equals("Approved"))
        .Select(s => s.Approver)
        .Distinct()
        .Aggregate(string.Empty, (i, j) => i + ";" + j)
        .Split(';')
        .Distinct();
    

    即您应该使用带有种子参数的 Aggregate 重载。

    但是,您的查询看起来很连贯。如果您只想要 Approver 字段的不同值,则使用以下构造就足够了:

    var Aggregate = linqkb
        .Where(s => s.Status.Equals("Approved"))
        .Select(s => s.Approver)
        .Distinct();
    

    如果批准者字段包含用“;”分隔的值并且您想提取它们并获得不同的列表,那么您应该使用:

    var Aggregate = linqkb
        .Where(s => s.Status.Equals("Approved"))
        .SelectMany(s => s.Approver.Split(";"))
        .Distinct();
    

    【讨论】:

      【解决方案3】:

      错误就是所说的,没有元素。 linqkb.Where(s => s.Status.Equals("Approved")) 返回空集。聚合不能超过它。您可以使用Any() 进行检查。此外,您加入 ';' 并随后加入 Distinct 并没有真正做任何事情。

      var Aggregate = linqkb.Where(s => s.Status.Equals("Approved"))                                                                               .Select(s => s.Approver)
         .Distinct();
      
      if (!Aggreate.Any())
      return ...;
      

      【讨论】:

        猜你喜欢
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        相关资源
        最近更新 更多