我怎么写这样的东西:
int result = database
.Where(x => x.Name == "Criteria")
.Sum(x => x.Count)) ?? 0;
除非linq没有找到任何东西,否则它将返回总和值,它将返回0。
编辑:该字段不能为空。
编辑2:我正在使用实体框架。
答案 0 :(得分:17)
您与原始查询非常接近。您只需要投射Count
变量:
int result = database
.Where(x => x.Name == "Criteria")
.Sum(x => (int?)x.Count) ?? 0;
这样做比将它包装在Try / Catch中更有效率和优雅。
我怀疑您正在使用Entity Framework。如果你只是使用Linq-to-Objects,那么其他人提供的解决方案就可以了。
答案 1 :(得分:5)
这应该可以正常工作(不需要?? 0):
var result = database
.Where(x => x.Name == "Criteria")
.Sum(x => x.Count))
除非你想检查x本身是否为空:
var result = database
.Where(x => x != null)
.Where(x => x.Name == "Criteria")
.Sum(x => x.Count))
答案 2 :(得分:5)
你可以写:
int result = database
.Where(x => x.Name == "Criteria")
.Sum(x => x.Count));
Enumerable.Sum
方法在没有结果的情况下已经返回零。来自documentation:
如果source不包含任何元素,则返回零。
答案 3 :(得分:1)
这应该可以正常工作:
var result = database.Where(x => x.Name == "Criteria").Sum(x => x.Count));
如果Where
函数没有返回任何元素,则Sum
函数将返回0.
返回IEnumerable<T>
的所有Linq函数都将返回空集合,而不是null
。
答案 4 :(得分:0)
使用聚合扩展方法,其中0是种子值
int sum = database.Where(x=>x.Name == "Criteria")
.Aggregate(0, (total, next) => total +=next);
答案 5 :(得分:0)
我这样做的方式是没有人愿意,但却保留了100%的工作时间,不料!
int result = 0;
try{
result = database
.Where(x => x.Name == "Criteria")
.Sum(x => x.Count));
} catch (Exception e){ }