2010-12-23 33 views
0

我試圖通過linq2sql實現以下,但不成功。linq2sql左加入「多選」

我有會員和參考表。數據庫的設計方式是成員可以有多個(> = 0)引用。作爲查詢的結果,我想要的是成員的列表(行),其中成員的所有引用都被「收集」在一列中。

我已經實現了以下查詢,但是對於這一個,每個Reference都有一行。

var refs = (from m in db.Members 
        join 
         r in db.References on m.PID equals r.PID into g 
        from o in g.DefaultIfEmpty() 
        select new 
        { 
         member = m, 
         name = (o == null ? "" : o.NameSurname) 
        }); 

我覺得我需要插入的SelectMany somewher :)

您能給在實現這一目標的提示?

回答

0

你的意思是這樣的:

var refs = from m in db.Members 
      join r in db.References on m.PID equals r.PID into j 
      from o in j.DefaultIfEmpty() 
      select new { Member = m, Reference = o } into results 
      group result by result.Member into g 
      select g; 

那倒組所有結果由成員(該組的關鍵),並與他們(結果匹配的密鑰)相關聯的所有引用。

雖然你可能是更好的只是設置的關係了在ORM那麼你可以參考(可能命名)member.References屬性,像這樣:

foreach(var member in db.Members) 
{ 
    var allReferences = member.References; 
} 
+0

第一個查詢不起作用,因爲在查詢後我可以訪問引用名稱 - 姓。第二個在計算上不可行,因爲它會爲我的每個成員查詢引用表。我有大約6M的成員和4M的參考 - 所以在最壞的情況下,它意味着查詢4M行數據6M次。 – oop123123 2010-12-24 12:40:48

1
var refs = (from m in db.Members 
         select new 
         { 
          member = m, 
          name = String.Join(",",(from r in db.References on m.PID equals r.PID into g 
         from o in g.DefaultIfEmpty() select o.NameSurname).toArray()) 
         }).Distinct(); 

這是未經測試,但我認爲這是你想要的。它應該抓住你的成員,並將所有引用都加入到名稱中。如果它不起作用,讓我知道,我會進一步研究它。

+0

上述連接語句不起作用。我嘗試使用相同的想法進行查詢,並更改查詢以獲得「name」:name = String.Join(「,」,db.References.Where(r => r.PID == m.PID).Select(r => r.AdSoyad).ToArray()) 但是,它再次爲我的每個成員查詢References表。我有大約6M的成員和4M的參考 - 所以在最壞的情況下,它意味着查詢4M行數據6M次。 – oop123123 2010-12-24 12:59:02