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

当前回答

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

(decimal?)(x.TicketDetails.Sum(y => y.Cost *y.Qty)) ?? 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;

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

(decimal?)(x.TicketDetails.Sum(y => y.Cost *y.Qty)) ?? 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();

试试这个吧,它更简短:

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