LINQ拉回对象图

时间:2009-06-03 03:11:47

标签: linq grouping

是否可以在LINQ中按多个组进行分组?

例如,我有这个查询(显然不完整)

from lxr in LOCATION_XREFs
    join l in LOCATIONs on lxr.LOCATION_SKEY equals l.LOCATION_SKEY
    join c in COMPANies on l.COMPANY_SKEY equals c.COMPANY_SKEY
    join prlx in PeopleRoleLocationXrefs on lxr.LOCATION_XREF_SKEY equals prlx.LOCATION_XREF_SKEY
    join p in PEOPLEs on prlx.PEOPLE_SKEY equals p.PEOPLE_SKEY
    join pr in PeopleRoles on prlx.PeopleRoleKey equals pr.PeopleRoleKey

...而且我想找回一些公司,这些公司有很多地方,反过来又有很多人。

2 个答案:

答案 0 :(得分:1)

如果您希望按多个参数进行分组,则可以:

from lxr in LOCATION_XREFs
    join l in LOCATIONs on lxr.LOCATION_SKEY equals l.LOCATION_SKEY
    join c in COMPANies on l.COMPANY_SKEY equals c.COMPANY_SKEY
    join prlx in PeopleRoleLocationXrefs on lxr.LOCATION_XREF_SKEY equals prlx.LOCATION_XREF_SKEY
    join p in PEOPLEs on prlx.PEOPLE_SKEY equals p.PEOPLE_SKEY
    join pr in PeopleRoles on prlx.PeopleRoleKey equals pr.PeopleRoleKey
group c by new { c.COMPANY_SKEY, l.LOCATION_SKEY} into myGroup
select new
{
    myGroup.Key.COMPANY_SKEY,
    myGroup.Key.LOCATION_SKEY,
    myGroup.Count()
}

答案 1 :(得分:1)

我最终使用以下代码来实现我想要的。有趣的说明:请注意,我希望Roles变平并用逗号连接,所以我使用使用Aggregate运算符的包装器访问器来完成此操作。显然,聚合运算符不会在LINQ查询中被提取,因为你得到"the query operator "Aggregate" is not supported"否则我就会在内联这样做Roles = new List<string>(g.Select(u => u.pr.RoleName)).Aggregate((a, b) => a + ", " + b)

public class DAOPerson
{
    public string Name { get; set; }
    public int PeopleSkey { get; set; }
    public List<string> RolesCollection { get; set; }
    public string Roles
    {
        get { return RolesCollection.Aggregate((a, b) => a + ", " + b); }
    }
}

IQueryable<DAOLocation> gridData;
gridData = (from lxr in db.LOCATION_XREFs
            join l in db.LOCATIONs on lxr.LOCATION_SKEY equals l.LOCATION_SKEY
            join c in db.COMPANies on l.COMPANY_SKEY equals c.COMPANY_SKEY
            where lxr.DEPARTMENT_NUMBER == Department.BINDING_AUTHORITY_KEY
                  && lxr.BRANCH_NUMBER == Branch.ATLANTAKEY
            orderby c.NAME, l.INTERNAL_NAME ascending
            select new DAOLocation
                       {
                           CompanyName = c.NAME,
                           CompanySkey = c.COMPANY_SKEY,
                           LocationName = l.INTERNAL_NAME,
                           LocationSkey = l.LOCATION_SKEY,
                           Persons = (from prlx in db.PeopleRoleLocationXrefs
                                      join lxr2 in db.LOCATION_XREFs on prlx.LOCATION_XREF_SKEY equals lxr.LOCATION_XREF_SKEY
                                      join p in db.PEOPLEs on prlx.PEOPLE_SKEY equals p.PEOPLE_SKEY
                                      join pr in db.PeopleRoles on prlx.PeopleRoleKey equals pr.PeopleRoleKey
                                      where lxr2.LOCATION_SKEY == l.LOCATION_SKEY
                                      group new { p, pr } by p.PEOPLE_SKEY into g
                                      select new DAOPerson
                                                 {
                                                     Name = g.First().p.LAST_NAME,
                                                     PeopleSkey = g.First().p.PEOPLE_SKEY,
                                                     RolesCollection = new List<string>(g.Select(u => u.pr.RoleName))
                                                 }).ToList()
                       });