2011-05-11 20 views
8

我的MyObject的名單,看起來像這樣:加入列表使用LINQ到SQL查詢

public class MyObject{ 
    public int FruitID {get;set;} 
    public string FruitName {get;set;} 
} 

List<MyObject> TheList = new List<MyObject>(); 

此列表中填充了LINQ到SQL查詢。我正在尋找在這個列表和一個包含FruitID作爲外鍵的表之間創建一個連接。

表HarvestTimes看起來是這樣的:

FruitID | HarvestDatetime | RipeFactor 
    3  |  3/4/2011 |  2 
    3  |  4/5/2011 |  4 
    3  |  5/5/2011 |  3 
    4  |  3/21/2011 |  2 
    4  |  4/10/2011 |  2 
    4  |  5/10/2011 |  2 

這是我到目前爲止有:

var TheQuery = (from list in TheList 
       join fruit in MyDC.HarvestTimes on 
       list.FruitID equals fruit.FruitID 
       where .... 
       select new MyObject{... }).ToList(); 

我有一些麻煩Where子句。 如何獲得只有RipeFactor始終爲2的水果。例如,Fruit 3的RipeFactor爲2,但也有4,而只有Fruit4只有2。我嘗試過Contains,但兩種水果都出現了。

感謝您的建議。

+0

不知道這是可能的,購買嘗試通過FruitID,成熟的因素分組,然後計算每個行數FruitID組,如果count爲1,並且熟化因子是您想要的,然後選擇它... – atoMerz 2011-05-11 16:02:50

+0

TheList是否與HarvestTimes中存在的DataContext相同? – Magnus 2011-05-11 16:16:34

+0

@Magnus,是的,同樣的DC – frenchie 2011-05-11 17:41:42

回答

3

假設有一個表HaverstTime和水果之間的關係:

var TheQuery = MyDC.HarvestTimes 
    .Where(p => TheList.Select(q => q.FruitID).Contains(p.FruitID)) 
    .GroupBy(p => p.Fruit) 
    .Where(p => p.All(q => q.RipeFactor == 2)) 
    .Select(p => p.Key); 

這將創建一個我認爲這可以很容易地轉換爲MyObject。

更新: 哎呀我忘了添加TheList.Select(q => q.FruitID)。這就是爲什麼它沒有編譯。 對不起=)

UPDATE2: 做同樣的,考慮Ripefactor = 2和3

var TheQuery = MyDC.HarvestTimes 
    .Where(p => TheList.Select(q => q.FruitID).Contains(p.FruitID)) 
    .GroupBy(p => p.Fruit) 
    .Where(p => p.All(q => q.RipeFactor == 2 || q.RipeFactor == 3)) 
    .Select(p => p.Key); 
+0

應該是.GroupBy(p => p.FruitID)? – frenchie 2011-05-11 18:38:31

+0

出於某種原因,.Where(p => TheList.Contains(p.FruitID))語句帶有紅色下劃線。 – frenchie 2011-05-11 18:40:31

+0

這取決於。我以爲你想選擇水果對象,而不是FruitID。在這種情況下,你可以做GroupBy(p => p.FruitID),它也應該工作。 – Francisco 2011-05-11 18:48:01

1

,我認爲這會工作

var fruit = (from list in TheList 
      join fruit in 
       (from fr in MyDc.HarvestTimes 
       group fr by fr.FruitID into fg 
       where !fg.Any(f => f.RipeFactor != 2) 
       select fg) 
      on list.FruitID equals fruit.Key 
      select new MyObject{... }).ToList(); 

更新 - 如果你只想要回FruitIDs的不同的列表中,您需要選擇fg.Key而不是FG

var fruit = (from list in TheList 
      join fruit in 
       (from fr in MyDc.HarvestTimes 
       group fr by fr.FruitID into fg 
       where !fg.Any(f => f.RipeFactor != 2) 
       select fg.Key) 
       on list.FruitID equals fruit 
       select new MyObject{... }).ToList(); 
+0

是的,它的工作原理是它只返回Fruit4。我又看了一遍,然後意識到它將返回所有的Fruit4記錄,而不僅僅是一個。我想我並不清楚,我的不好。在這種情況下,單獨工作嗎? – frenchie 2011-05-11 18:00:42

+0

@frenchie - 更新了答案。那是你在找什麼? – Aducci 2011-05-11 18:20:51

+0

我不知道爲什麼,但它仍然顯示重複。 – frenchie 2011-05-11 18:36:14