6

私のアプリケーションでは、会社には多くの従業員がいる可能性があり、各従業員は複数の電子メールアドレスを持っている可能性があります。

データベーススキーマは、次のようにテーブルを関連付けます。

会社->CompanyEmployeeXref->従業員->EmployeeAddressXref->メール

Entity Frameworkを使用していて、会社の名前とその従業員の電子メールアドレスのコンマ区切りリストを返すLINQクエリを作成したいと思います。これが私が試みているクエリです:


from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
select new {
              c.Name,
              a.Email.Aggregate(x=>x + ",")
           }


必要な出力:

「Company1」、「a @ company1.com、b @ company1.com、c @company1.com」

「Company2」、「a @ company2.com、b @ company2.com、c @company2.com」

..。

私はこのコードが間違っていることを知っています。私はgroupbyが欠落していると思いますが、それは要点を示しています。構文がわかりません。これも可能ですか?助けてくれてありがとう。

4

2 に答える 2

7

これで問題が解決しました。


from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
group a.Email by new {c.Name} into g
select new {
                Company=g.Key.Name,
                Email=g.Select(e=>e).Distinct()
            }
).ToList()
.Select(l=> 
           new {
                    l.Name,
                    Email=string.Join(",", l.Email.ToArray())
                }
        )


于 2010-05-18T22:29:04.787 に答える
5

SQL Server自体にはコンマ区切りリストを生成できる集計演算子がないため、純粋なLinq to SQL(またはEntity Framework、どちらを使用している場合でも)でこれを行うのは実際にはかなり困難です。したがって、変換する方法がありません。このステートメント全体を1つのクエリにまとめます。「単一ステートメント」のLinqtoSQLの回答を提供することはできますが、実際にはあまり良いパフォーマンスは得られず、EFでまったく機能するかどうかはわかりません。

醜いですが、通常の結合を実行し、結果を具体化してから、LinqtoObjectsを使用して連結を実行するとさらに優れています。

var rows =
    (from c in Company
     join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
     join e in Employee on ex.EmployeeId equals e.Id
     join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
     join a in Address on ax.AddressId equals a.Id
     select new 
     {
         c.Name,
         a.Email
     }).AsEnumerable();

var emails =
    from r in rows
    group r by r.Name into g
    select new
    {
        Name = g.Key,
        Emails = g.Aggregate((x, y) => x + "," + y)
    };
于 2010-05-18T21:31:09.777 に答える