linq2sql左连接“multiselect”

时间:2010-12-23 13:50:24

标签: sql-server-2005 linq-to-sql

我正在努力通过linq2sql实现以下功能,但没有成功。

我有会员和参考表。 DB的设计方式是成员可以有多个(> = 0)引用。作为查询的结果,我想要的是成员的列表(行),其中成员的所有引用都被“收集”在一列中。

我所获得的是跟随查询,但是对于这个,每个参考都有一行。

 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:)

您能否提出实现目标的提示?

2 个答案:

答案 0 :(得分: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();

这是未经测试的,但我认为这正是您所寻求的。它应该抓住你的成员并将所有引用加入到名称中。如果它不起作用,请告诉我,我会深入研究它。

答案 1 :(得分: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;
}