2014-03-26 134 views
0

我有一張表,其中包含PlanID &位置爲兩列,具有「多對一」關係。 也就是說,一個planID可以有多個位置。Linq:將行分組並將它們返回給匿名集合

的樣本數據可能如下:

PlanID Location 
------ -------- 
111  Blr 
111  Bom 
222  Chn 
333  Hyd 
111  Bhu 
333  Ctc 

我試圖通過獨特PlanIDs組他們&返回匿名收集(比如UniquePlans)象下面這樣:

PlanID Location 
------ -------- 
111  Blr 
111  Bom 
111  Bhu 


PlanID Location 
------ -------- 
333  Hyd  
333  Ctc 

PlanID Location 
------ -------- 
222  Chn 

一旦我有結果收集準備好後,我需要爲每個項目執行一些操作,例如:

foreach (var planID in uniquePlans) 
    { 
     foreach (var loc in PlanLocation) 
     { 
      //TODO : WCF call to fetch some detail based on planID & PlanLocation 
      // pDetail = GetPlanDetails(planID, PlanLocation); 
     } 
    } 

我正在使用實體框架從SQL服務器DB &中使用下面的代碼獲取數據我能夠找到所有唯一的PlanID。

var uniquePlanCollections = myEntities.PlanDetails.Select(p => p.PlanID).Distinct(); 

但在那之後如何將它們組合(使用LINQ或lambda EXP),這樣我可以使用他們我foreach循環裏面我沒有得到任何線索。

我以前也試圖像下面,但它不工作...

var test = from r in myEntities.PlanDetails 
         group r by new 
         { 
          r.PlanID, 
          r.Location 

         } into g 
         select new 
         { 
          PlanID= g.Key.PlanID, //Can I use distinct here? 
          Location = g.Key.Location 
         }; 

回答

2

使用ToLookup:

var lookup = myEntities.PlanDetails.ToLookup(pd => pd.PlanID, pd => pd.Location); 
foreach (var grouping in lookup) 
{ 
    var planId = grouping.Key; 
    foreach (var location in grouping) 
    { 
     // do something with planId and location here 
    } 
} 

而且,如果位置屬性指向另一個表,一定要在ToLookup之前添加.Include(pd => pd.Location),以便將所有信息加載到單個查詢中。

+0

我不知道你是如何確保它將被分組到三個不同的獨特組/集合。你能解釋那部分代碼嗎?如果它這樣做的話? – Biki

+0

[This is](http://geekswithblogs.net/BlackRabbitCoder/archive/2011/03/24/c.net-little-wonders-the-tolookup-linq-extension-method.aspx)非常好的文章'ToLookup()'方法。它會將您的收藏夾分成三個不同的收藏夾(基於傳遞給該方法的參數) –

+0

但是,當我測試上述代碼時,我發現分組正在發生正確,但是在每個組中,只有第一個位置重複多次,而不是唯一的位置(例如:對於PlanID:333組,位置「Hyd」重複兩次,而不是「Hyd」和「CTC」。] – Biki

相關問題