如何在源集合为空时强制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);
尝试将查询更改为:
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