2010-12-23 30 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