0

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

...そして、たくさんの場所を持ち、たくさんの人がいるたくさんの会社を取り戻したいと思います。

4

2 に答える 2

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()
}
于 2009-06-03T03:23:02.827 に答える
1

最終的には、次のコードを使用して、目的を達成しました。興味深い点: ロールをフラットにしてコンマで連結したかったので、Aggregate 演算子を使用するラッパー アクセサーを使用してこれを行いました。どうやら 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()
                       });
于 2009-06-04T14:14:19.080 に答える