在我的 WCF 服务的业务逻辑中,我有一个允许按一个或多个列过滤用户的功能。我做过滤的方式是这样的:
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));
}
我的问题是: 数据库上发生了哪些查询以及本地发生了什么?
显然,我不希望每次都将数据库中的所有用户都提取到我的记忆中......
我假设因为“按订单过滤”使用本地函数 - 无法在数据库上完成,所以这是在本地完成的。我对吗 ?
如果是这样 - 这是否意味着之后发生的所有事情也会在本地发生?
如果没有“按订单过滤”怎么办?一切都会在数据库端完成吗?
LINQ-TO-EF 是否知道如何将“婚姻状况”查询“翻译”为数据库端查询?(我正在检查用户的婚姻状况枚举是否存在于传递给函数的枚举列表中)。
谢谢 !
[编辑:对不起。我不知道为什么代码没有自动着色]