2012-02-10 66 views
2

我正在使用包含兩個表格的DataSet,我試圖通過LINQ獲取數據。如何使用LINQ來過濾集合到數據集

我很努力弄清楚如何返回符合條件的記錄的語法。

實施例:

下面是兩個表:

FooBar Items

FooBar Data

此查詢連接兩個表(商品Z將被過濾掉)

private void ParseFooBar() 
{ 
.... 
var fooBars = from item in fooBarItems 
     join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"] 
     where (new[] {"A","B","C"}).Contains(item["id"]) 
     select new 
     { 
     id = item["id"], 
     description = item["description"], 
     wat = data["wat"], 
     foo = data["foo"]     
     }; 
} 

這是從上述查詢派生的集合。

FooBar Items joined with FooBar Data

問:我怎麼只返回美孚項目?

請注意,Foo項目在第一行中記錄的是非空值,而Bar項目在第一行/記錄中沒有非空值。使用這樣一個事實,即所有Foo項目在foo列中至少有一個非空值,並且Bar項目在foo列中永遠不會有非空值,那麼如何更新上述查詢以便該查詢僅返回Foo項目?同樣,我如何更新查詢,以便它只返回條款項目?

回答

1

這並不完全清楚,我什麼標準是,作爲一個富與一個酒吧,但這裏有一些想法:

var foos1 = fooBars.Where(fb => fb.wat != "bar"); 
var foos2 = fooBars.Where(fb => fb.wat == "foo" || fb.wat == null); 
var foos3 = fooBars.Where(fb => fb.wat == "foo" || fb.foo != null); 
var bars = fooBars.Where(fb => fb.wat == "bar" || fb.foo != null); 
1

這取決於要過濾不需要的nulls出來。如果在加盟的水平,你可以稍微改變您的查詢:

from item in fooBarItems 
join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"] 
where (new[] {"A","B","C"}).Contains(item["id"]) && data["foo"] != null 
select new 
{ 
    id = item["id"], 
    description = item["description"], 
    wat = data["wat"], 
    foo = data["foo"]     
}; 

這將返回只有兩個元素:

  • A, I am a Foo, null, 10834
  • B, I am a Foo, null, 08385383

要獲得其餘的(包括那些foonull但他們還是克至富具有非空條目),使用.GroupBy.Where結合您的主查詢後:

fooBars 
    .GroupBy(f => f.id) 
    .Where(g => g.Any(f => f.foo != null)) 
    .SelectMany(g => g); // just to make it nice list-like looking 

這將選擇整個組,但只有那些具有至少一個foo與非空值(這將是最終收集的所有條目,除了那些具有id = C的條目)。

+0

我喜歡你的想法與附加的lambda - 它看起來像會起作用,但它不。更新查詢的結果返回與原始文件不同的集合。奇怪。 – Jed 2012-02-10 23:18:19

+0

@Jed:哦,發了一個錯字。應該是'f.foo!= null',而不是'「」'。現在修復。 – 2012-02-10 23:21:35