私は電子メールアドレスの配列に渡され、各電子メールアドレスに対して、その電子メールアドレスに関連するメンバーからnumTotalとnumActiveを返す必要があります。リストをLINQに渡すときの単一のデータベース呼び出し
伝統的に、私はメンバーテーブルから照会し、渡された電子メール配列にメンバーの電子メールアドレスが存在する場所をフィルタリングします。しかし、これはメンバーテーブルに存在する電子メールのカウントを含む電子メールアドレスのリストのみを返します。代わりに、メンバーに電子メールアドレスがあるかどうかにかかわらず、提供される電子メールアドレスごとにレコードが必要です。
解決方法私のソリューションは、電子メールの配列をループしてサブクエリを実行することです。これは機能し、私は必要なものを手に入れることができますが、コールをプロファイルすると、EFが各電子メールアドレス/サブクエリに対して別々のクエリを実行していることがわかります。
var result = (from email in emailAddresses
select new EmailAddressStats {
Total = membersQueryable.Any(m => m.Email == email),
Active = membersQueryable.Any(m => m.Email == email && m.IsActive)
}).ToList();
3つの電子メールアドレスを渡すと、6つの個別のクエリ(3つの電子メールアドレス* 2つのサブクエリ)が表示されます。
.AsQueryable()
を使用して配列をクエリ可能にしようとしましたが、私はまだ同じ結果を得ています。
SELECT ([totalSubquery]) AS Total,
([activeSubquery]) AS Active
FROM ????
WHERE EXISTS ('[email protected]', '[email protected]', '[email protected]')
注:
理想的には私はEFのようなものを生成したいと思い、私は4.
は私があなたの問題を理解してかどうかわからないんだけど、couldn(これは代わりに、クエリ式の構文の流暢な構文であるが、私は唯一の流暢な構文でこれを行う方法を知っていることを申し訳ありません)あなたは 'JOIN'を使っていますか? 'RIGHT JOIN'私は助けます。 –