207

基本上,当我执行以下查询时,如果没有匹配的线索,则以下查询会引发异常。在这种情况下,我宁愿让总和等于 0,而不是抛出异常。这是否可能在查询本身 - 我的意思是而不是存储查询和检查query.Any()

double earnings = db.Leads.Where(l => l.Date.Day == date.Day
                && l.Date.Month == date.Month
                && l.Date.Year == date.Year
                && l.Property.Type == ProtectedPropertyType.Password
                && l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
4

7 回答 7

429

尝试将您的查询更改为:

db.Leads.Where(l => l.Date.Day == date.Day
            && l.Date.Month == date.Month
            && l.Date.Year == date.Year
            && l.Property.Type == ProtectedPropertyType.Password
            && l.Property.PropertyId == PropertyId)
         .Select(l => l.Amount)
         .DefaultIfEmpty(0)
         .Sum();

这样,您的查询将只选择该Amount字段。如果集合为空,它将返回一个值为 的元素,0然后应用总和。

于 2013-07-11T12:36:51.473 回答
210

我更喜欢使用另一种技巧:

double earnings = db.Leads.Where(l => l.Date.Day == date.Day
                                      && l.Date.Month == date.Month
                                      && l.Date.Year == date.Year
                                      && l.Property.Type == ProtectedPropertyType.Password
                                      && l.Property.PropertyId == PropertyId)
                          .Sum(l => (double?) l.Amount) ?? 0;
于 2014-04-21T07:08:12.170 回答
8

试试这个,它更短:

db.Leads.Where(..).Aggregate(0, (i, lead) => i + lead.Amount);
于 2014-09-10T10:27:18.997 回答
4

这对我来说是胜利:

int Total = 0;
Total = (int)Db.Logins.Where(L => L.id == item.MyId).Sum(L => (int?)L.NumberOfLogins ?? 0);

在我的 LOGIN 表中,在字段 NUMBEROFLOGINS 中,一些值为 NULL,而另一些值为 INT 号。我在这里总结了一个公司(每个 Id)的所有用户的总 NUMBEROFLOGINS。

于 2019-04-25T17:56:00.950 回答
3

尝试:

双倍收益 = db.Leads.Where(l => l.ShouldBeIncluded).Sum(l => (double?) l.Amount) ?? 0 ;

查询“ SELECT SUM([Amount]) ”将为空列表返回 NULL。但是,如果您使用 LINQ,它期望“ Sum(l => l.Amount) ”返回双精度并且它不允许您使用“ ?? ”运算符将 0 设置为空集合。

为了避免这种情况,您需要让 LINQ 期望“ double? ”。您可以通过投射“ (double?)l.Amount ”来做到这一点。

它不影响对 SQL 的查询,但它使 LINQ 可用于空集合。

于 2019-10-10T12:44:27.257 回答
0
db.Leads.Where(l => l.Date.Day == date.Day
        && l.Date.Month == date.Month
        && l.Date.Year == date.Year
        && l.Property.Type == ProtectedPropertyType.Password
        && l.Property.PropertyId == PropertyId)
     .Select(l => l.Amount)
     .ToList()
     .Sum();
于 2016-06-24T21:35:08.283 回答
0

另一种选择是强制转换值,如下面的代码所示

(decimal?)(x.TicketDetails.Sum(y => y.Cost *y.Qty)) ?? 0
于 2021-06-29T18:03:03.053 回答