サブクエリをコンマセパートされた値としてのLINQクエリ
質問
私のアプリケーションでは、会社には多くの従業員がいることがあり、各従業員には複数のメールアドレスがある場合があります。
データベーススキーマは、次のようなテーブルを関連付けます。
会社 - > CompanyEmployeExref->従業員 - > employeeaddressxref->電子メール
エンティティフレームワークを使用しており、会社の名前を返す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 + ",")
}
Desired Output:
"Company1", "a@company1.com,b@company1.com,c@company1.com"
"Company2", "a@company2.com,b@company2.com,c@company2.com"
...
私はこのコードが間違っていることを知っています、私はグループが欠けていると思いますが、それはポイントを示しています。構文がわかりません。これも可能ですか?助けてくれてありがとう。
解決
これが問題を解決しました:
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())
}
)
他のヒント
SQL Server自体にはコンマ区切りリストを作成できる集計オペレーターがないため、純粋なlinqからSQL(またはエンティティフレームワーク)でこれを行うことは、実際にはかなり困難です。このステートメント全体が単一のクエリに。 「単一ステートメント」LINQからSQL Answerを提供することはできますが、実際にはあまり良いパフォーマンスを提供するつもりはありません。EFではまったく機能するかどうかはわかりません。
それは醜いですが、定期的な結合を行い、結果を具体化し、LINQを使用してオブジェクトに連結する場合はさらに優れています。
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)
};
所属していません StackOverflow