私の WCF サービスのビジネス ロジックには、1 つ以上の列でユーザーをフィルター処理できる関数があります。フィルタリングを行う方法は次のとおりです。
public List<UserDto> GetUsersByFilters (
String ssn,
List<Guid> orderIds,
List<MaritalStatusEnum> maritalStatuses,
String name,
int age
)
{
using (MyProjEntities entities = new MyProjEntities())
{
IQueryable<User> users = entities.Users;
// Filter By SSN (check if the user's ssn matches)
if (String.IsNullOrEmusy(ssn) == false)
users = users.Where(us => us.SSN == ssn);
// Filter By Orders (check fi the user has all the orders in the list)
if (orderIds != null)
users = users.Where(us => UserContainsAllOrders(us, orderIds));
// Filter By Marital Status (check if the user has a marital status that is in the filter list)
if (maritalStatuses != null)
users = users.Where(pt => maritalStatuses.Contains((MaritalStatusEnum)us.MaritalStatus));
// Filter By Name (check if the user's name matches)
if (String.IsNullOrEmusy(name) == false)
users = users.Where(us => us.name == name);
// Filter By Age (check if the user's age matches)
if (age > 0)
users = users.Where(us => us.Age == age);
return users.ToList();
}
}
private Boolean UserContainsAllOrders(User user, List<Guid> orderIds)
{
return orderIds.All(orderId => user.Orders.Any(order => order.Id == orderId));
}
私の質問は次のとおり です。データベースで発生するクエリとローカルで発生するクエリは何ですか?
明らかに、データベース内のすべてのユーザーが毎回メモリにフェッチされることは望ましくありません...
「Filter By Orders」はローカル関数を使用しているため、データベースでは実行できないため、ローカルで実行されていると思います。私は正しいですか?
もしそうなら、結果として、その後に起こることはすべてローカルでも起こるということですか?
また、「注文によるフィルター」がなかったらどうなるでしょうか? データベース側ですべてが行われますか?
LINQ-TO-EF は、「婚姻状況」クエリをデータベース側のクエリに「変換」する方法を知っていますか? (関数に渡された列挙型のリストにユーザーの婚姻状況列挙型が存在するかどうかを確認しています)。
ありがとう !
[編集: 申し訳ありません。コードが自動色付けされない理由がわかりません]