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();
请帮帮我。我有一个包含许多过滤条件的 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 ...;
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();