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ます。コレクションが空の場合、値を持つ 1 つの要素が返され0、合計が適用されます。

于 2013-07-11T12:36:51.473 に答える
8

代わりにこれを試してください。短いです:

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

試す:

二重収益 = db.Leads.Where(l => l.ShouldBeIncluded).Sum(l => (double?) l.Amount) ?? 0 ;

クエリ " SELECT SUM([Amount]) " は、空のリストに対して NULL を返します。しかし、LINQ を使用すると、" Sum(l => l.Amount) " が double を返すことが期待され、" ?? " 演算子を使用して空のコレクションに 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 に答える