LinQ 聚合错误 - 序列不包含任何元素

LinQ Aggregate Error - Sequence contains no elements

请帮帮我。我有一个包含许多过滤条件的 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.Where(s => s.Status.Equals("Approved")) returns空集。聚合不能 运行 超过它。您可以使用 Any() 进行检查。此外,您加入 ';' 并稍后执行 Distinct 并没有真正做任何事情。

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

if (!Aggreate.Any())
return ...;
如果提供 none,

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

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

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

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

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

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

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

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

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

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