Linq结果如果为null则为零

时间:2013-05-27 18:30:27

标签: c# linq entity-framework

我怎么写这样的东西:

            int result = database
                .Where(x => x.Name == "Criteria")
                .Sum(x => x.Count)) ?? 0;

除非linq没有找到任何东西,否则它将返回总和值,它将返回0。

编辑:该字段不能为空。

编辑2:我正在使用实体框架。

6 个答案:

答案 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){ }