2013-05-27 47 views
2

我怎樣寫是這樣的:LINQ的結果,如果空接零

  int result = database 
       .Where(x => x.Name == "Criteria") 
       .Sum(x => x.Count)) ?? 0; 

凡將返回總和值,除非LINQ未發現任何在這種情況下,它會返回0

編輯:該字段不可爲空。

編輯2:我正在使用實體框架。

+1

可能有更好的方法,但是你總是可以在查詢中添加'。FirstOrDefault()'。 – Tim

+0

FirstOrDefault不對已經聚合爲int的linq語句進行操作。 – Bill

+2

「如果源不包含任何元素,則此方法返回零。」 –

回答

14

您與原始查詢非常接近。你只需要投你Count變量:

int result = database 
    .Where(x => x.Name == "Criteria") 
    .Sum(x => (int?)x.Count) ?? 0; 

這樣做,這樣會有點比一個try/catch包裹它更高效,更優雅。

我懷疑你使用的是實體框架。如果你只是使用Linq-to-Objects,其他人提供的解決方案都可以工作。

+0

這是要走的路。 +1 – maxlego

+0

你說得對,我正在使用Entity Framework,我會試試這個。 – Bill

+0

非常好,效果很好! – Bill

1

這應該只是罰款:

var result = database.Where(x => x.Name == "Criteria").Sum(x => x.Count)); 

如果沒有元素被Where函數返回然後Sum函數將返回0。

所有返回的IEnumerable<T>將返回LINQ的功能空集合而不是null

5

這應該工作正常(無需?? 0):

var result = database 
.Where(x => x.Name == "Criteria") 
.Sum(x => x.Count)) 

除非你想檢查是否X本身爲空或不是:

var result = database 
.Where(x => x != null) 
.Where(x => x.Name == "Criteria") 
.Sum(x => x.Count)) 
5

你可以這樣寫:

int result = database 
      .Where(x => x.Name == "Criteria") 
      .Sum(x => x.Count)); 

Enumerable.Sum方法在沒有結果時已經返回零。從documentation

如果源不包含任何元素,則返回零。

+0

我認爲這隻適用於IEnumerable版本而非IQueriable。 IQueriable版本返回null,並解決'?? 0'的作品。 – NER1808

0

使用聚合擴展方法,其中0是一個種子值

int sum = database.Where(x=>x.Name == "Criteria") 
        .Aggregate(0, (total, next) => total +=next); 
0

我這麼做是一種方式,沒有人會喜歡,但garrantee工作時間的100%,看哪!

 int result = 0; 
     try{ 
      result = database 
       .Where(x => x.Name == "Criteria") 
       .Sum(x => x.Count)); 
     } catch (Exception e){ }