性別が一致するすべてのデフォルトの顧客アドレスを返そうとする方法があります。System.Func メソッドを where 句に渡すことで、フィルタリング クエリを少しずつ構築できるようにしたいと考えています。
var emailAddresses = new List<string>();
// get all customers.
IQueryable<Customer> customersQ = base.GetAllQueryable(appContext).Where(o => o.Deleted == false);
// for each customer filter, filter the query.
var genders = new List<string>() { "C" };
Func<Customer, bool> customerGender = (o => genders.Contains(o.Addresses.FirstOrDefault(a => a.IsDefaultAddress).Gender));
customersQ = customersQ.Where(customerGender).AsQueryable();
emailAddresses = (from c in customersQ
select c.Email).Distinct().ToList();
return emailAddresses;
しかし、このメソッドはすべてのアドレス (8000) 回に対してデータベースを呼び出すため、非常に低速です。
ただし、2行を置き換えると
Func<Customer, bool> customerGender = (o => genders.Contains(o.Addresses.FirstOrDefault(a => a.IsDefaultAddress).Gender));
customersQ = customersQ.Where(customerGender).AsQueryable();
1行で
customersQ = customersQ.Where(o => genders.Contains(o.Addresses.FirstOrDefault(a => a.IsDefaultAddress).Gender)).AsQueryable();
次に、クエリはデータベースに対して 1 回の呼び出しを行うだけで、非常に高速です。
私の質問は、なぜこれが違いを生むのですか? データベースを 1 回呼び出すだけで最初のメソッドを機能させるにはどうすればよいですか?