2011-11-10 52 views
1

我有一個類似的T-SQL代碼片段:如何檢測linq中不存在的行?

select p.Make, count(p.Make) as _count 
from Products p 
where p.GroupId = @GroupId 
group by p.Make 

整個結果集,將一些與5行:

Make _count 
`````````````` 
Make1 32 
Make2 54 
Make3 60 
Make4 09 
Make5 47 

在C#中,我試圖計算每個百分比使(假設我知道已經有完整的產品),所以我可以構建谷歌圖像圖表(餅圖),所以我需要在那裏傳遞5個值。

我特林做到這一點:

int Make1Count = from row in DataSetProducts.tables[0].AsEnumerable() 
       where row.Field<string>("Make") == MyEnum.Makers.Make1.ToString() 
       select row.Field<int>("_count"); 

等高達Make5Count。理想情況下,我應該有5個結果,但是這並非總是如此,有時結果是這樣的:

Make _count 
`````````````` 
Make1 32 
Make4 09 
Make5 47 

但我仍然需要Make2和3(他們只是零)

我的問題是,例如,當找不到Make2時,此代碼會引發異常。 我該如何避免這種情況?

注1)在我的數據庫,不存在所有制造商的列表,所以我真的不能與任何

注2)在這裏,我避免Convert.toInt32只是from row in ...之前保持它理解它凝聚

這應該是相當微不足道的,但我無法以某種方式得到它。

回答

3

首先,它看起來像你想選擇一個單行(從SQL和LINQ的例子),但你的LINQ返回多行..相反,試試這個:

int Make1Count = (from row in DataSetProducts.tables[0].AsEnumerable() 
      where row.Field<string>("Make") == MyEnum.Makers.Make1.ToString() 
      select row.Field<int>("_count")) 
      .SingleOrDefault(); 

應該返回一個排,並解決一個問題。

現在,對於您真正的問題,當某行不存在時,SingleOrDefault()將返回數據類型的默認值,並根據該值進行檢查。例如INT的默認值是0,這是你想要的,和默認布爾是假等

+0

感謝的是做了對不起 – LocustHorde

0

改變你的SQL語句以下 選擇X.Make,計數(X.Make)

(select p.Make,count(p.Make)as _count from Products p 其中p.GroupId = @GroupId group by p。MAKE)T1

工會 選擇 'Make1',0

工會 選擇 'Make2',0

工會 選擇 'Make3',0

工會 選擇 'Make4', 0

union select'Make5',0 )

X

組由X.Make

+0

,你會做這?我不明白這個查詢 – LocustHorde

0

如何像財產以後,

var counts = DataSetProducts.tables[0].Select(row => 
       make = row.Field<string>("Make"), 
       count = row.Field<int>("_count")); 

int Make1Count = counts.SingleOrDefault(c => 
        c.make == MyEnum.Makers.Make1.ToString()).count;