4

我该如何写这样的东西:

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

除非 linq 没有找到任何东西,否则它将返回总和值,在这种情况下它将返回 0。

编辑:该字段不能为空。

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

4

6 回答 6

18

您与原始查询非常接近。你只需要转换你的Count变量:

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

这样做会比将它包装在 Try/Catch 中更有效和优雅。

我怀疑您正在使用实体框架。如果您只是使用 Linq-to-Objects,那么其他人提供的解决方案将会奏效。

于 2013-05-27T19:08:52.180 回答
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))
于 2013-05-27T18:36:01.913 回答
5

你可以写:

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

Enumerable.Sum方法已经在没有结果时返回零。从文档中:

如果 source 不包含任何元素,则返回零。

于 2013-05-27T18:37:00.023 回答
1

这应该可以正常工作:

var result = database.Where(x => x.Name == "Criteria").Sum(x => x.Count));

如果该函数没有返回任何元素,Where则该Sum函数将返回 0。

所有返回 an 的 Linq 函数IEnumerable<T>都将返回一个空集合而不是null.

于 2013-05-27T18:35:53.437 回答
0

使用聚合扩展方法,其中 0 是种子值

int sum = database.Where(x=>x.Name == "Criteria")
                  .Aggregate(0, (total, next) => total +=next);
于 2013-05-27T18:41:34.440 回答
0

我以一种没有人会喜欢的方式做到这一点,但保证 100% 的时间工作,看哪!

        int result = 0;
        try{
            result  = database
                .Where(x => x.Name == "Criteria")
                .Sum(x => x.Count));
        } catch (Exception e){ }
于 2013-05-27T18:55:18.013 回答