如何在源集合为空时强制LINQ Sum()返回0

本文关键字:Sum LINQ 返回 集合 | 更新日期: 2023-09-27 18:22:02

基本上,当我执行以下查询时,如果没有线索匹配,则以下查询会引发异常。在这种情况下,我更希望总和等于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);

如何在源集合为空时强制LINQ Sum()返回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)
         .DefaultIfEmpty(0)
         .Sum();

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

我更喜欢使用另一种破解方法:

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;

试试这个,它更短:

db.Leads.Where(..).Aggregate(0, (i, lead) => i + lead.Amount);

这是我的胜利:

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

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

尝试:

双倍收益=分贝。引线。Where(l=>l.ShouldBeIncluded)。Sum(l=>(双?)l。金额)??0

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

为了避免这种情况,您需要使LINQ期望"加倍?"。你可以通过铸造"(双?)l.Amount"来完成。

它不会影响对SQL的查询,但它使LINQ能够处理空集合。

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();

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

(decimal?)(x.TicketDetails.Sum(y => y.Cost *y.Qty)) ?? 0