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

时间:2016-06-16 10:52:01

标签: c# linq aggregate sequence

请在这里帮助我。我有一个具有许多过滤条件的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的新手。请建议。

我已经Google搜索并尝试在**.DefaultIfEmpty()**之前使用Aggregator,如下所示:

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

但这不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:5)

如果没有提供,

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

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

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

答案 1 :(得分:1)

错误就是说,没有元素。 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 ...;

答案 2 :(得分:1)

该问题的直接解决方案如下:

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();