如何强制LINQ Sum()返回0而源集合是空的

基本上,当我执行以下查询时,如果没有匹配的线索,下面的查询将抛出异常。在这种情况下,我宁愿让和等于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);
97223 次浏览

试着把你的查询改为这样:

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

这对我来说就是胜利:

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

在我的登录表,在字段NUMBEROFLOGINS一些值是NULL和其他人有一个INT数字。我在这里合计一个公司所有用户的登录总数(每个Id)。

试一试:

double earnings = db.Leads。Where(l => l. shouldbeincluded)。总和(l = > (double?) l.Amount) ?? 0;

查询“选择和((数量))”将为空列表返回NULL。 但如果你使用LINQ,它期望"总和(l => l. amount)"返回double,它不允许你使用"??"操作符为空集合设置0

为了避免这种情况,你需要让LINQ期望“双吗?”。你可以通过强制转换“(双)l。量”来实现。

它不影响对SQL的查询,但它使LINQ为空集合工作。

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

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