请在这里帮助我。我有一个具有许多过滤条件的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();
但这不起作用。
有什么建议吗?
答案 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();