2013-02-04 178 views
2

我有一個表,看起來有點像這樣的特定值的所有元素,但沒有:LINQ查詢選擇另一個值

| FruitID | BasketID | FruitType | 

我傳遞查詢的BasketIDs名單,我想名單FruitIDs,它們在BasketID之內並且僅僅是某個FruitType(值只能是1或2)。

這是我有:

var TheQuery = (from a in MyDC.MyTable 

       where TheBasketIDs.Contains(a.BasketID) && 
         a.FruitType == 1 // need help here 

       select a.FruitID).ToList(); 
我在表達第二 where條件有些困難

。我想FruitIDs所有的FruitType都是1,沒有一個是2。

| FruitID | BasketID | FruitType | 
| 23 | 2  | 1  | 
| 23 | 5  | 1  | 
| 19 | 2  | 1  | 
| 19 | 5  | 2  | 

例如,水果23是確定的,因爲它的FruitType始終爲1,但水果19也不行,因爲它也有2 FruitType,即使沒有我傳入的TheBasketIDs名單含有這樣做將是由水果ID組5

+0

您正在使用哪種LINQ提供程序? LINQ to SQL? – svick

+0

@svick:是的,linq-to-sql;目前。 – frenchie

+0

所以 - FruitID在表中並不是唯一的。一個水果有不同的類型,取決於它在哪個籃子...詳細信息。 –

回答

8

的一種方式,然後檢查結果組,LINQ表達式:

var ids = MyDC.MyTable 
    .GroupBy(r => r.FruitID) 
    // The following condition examines g, the group of rows with identical FruitID: 
    .Where(g => g.Any(item => TheBasketIDs.Contains(item.BasketID)) 
      && g.Any(item => item.FruitType == 1) 
      && g.All(item => item.FruitType != 2)) 
    .Select(g => g.Key); 

由此產生的FruitID是你想要的類型的列表。

編輯:(響應下面評論)

類型只有1或2,但從來3

然後你就可以簡化您的查詢,如下所示:

var ids = MyDC.MyTable 
    .GroupBy(r => r.FruitID) 
    // The following condition examines g, the group of rows with identical FruitID: 
    .Where(g => g.Any(item => TheBasketIDs.Contains(item.BasketID)) 
       // When there is no 3-rd state, FruitType==1 will keep FruitType==2 out 
      && g.All(item => item.FruitType == 1)) 
    .Select(g => g.Key); 
+0

我不應該先通過傳入列表中的所有BasketID進行分組嗎?表中將會有數百萬個FruitID。 – frenchie

+0

@dasblinkenlight:Sry,我想他的帖子已經更新了。我刪除了評論。 –

+0

@frenchie我認爲你的意思是「篩選」,而不是「BasketID」的「組」。如果你這樣做,如果邏輯將它們放在你篩選出的籃子之一中,它將不再「查看」FruitType == 2項目。 – dasblinkenlight

1
var TheQuery = (from a in MyDC.MyTable 
       group a by a.FruitID into g 
       where g.Any(b => TheBasketIDs.Contains(b.BasketID)) && g.All(b => b.FruitType == 1) 
       select g.Key).ToList();