質問

私のアプリケーションでは、会社には多くの従業員がいることがあり、各従業員には複数のメールアドレスがある場合があります。

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

会社 - > 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)
    };
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top