【发布时间】:2011-09-16 14:12:32
【问题描述】:
假设我有以下实体
-
用户
- 用户 ID
- 用户名
- UserNameAsLower
- 配置文件(导航属性)
-
简介
- 用户 ID
- 电子邮件
- EmailAsLower
- 语言
我想返回一个合并的对象,我们称它为 UserDTO,但删除一些我们不希望用户看到的字段(AsLower 的东西)
- 用户DTO
- 用户 ID
- 用户名
- 电子邮件
- 语言
如果我按如下方式编写 LINQ 查询,然后对其应用过滤条件,由于过滤条件应用于投影的类属性名称,它会在该点执行吗?
public IQueryable<UserDTO> GetUsers()
{
IQueryable<UserDTO> users = (from u in Entities.Users select new UserDTO() { UserID = u.UserID, UserName = u.UserName, Email = u.Profile.Email, Language = u.Profile.Email });
users = users.Where( u => u.UserName.Contains("Admin") );
return users;
}
我问的原因是它背后的数据库表是否真的很大(数百万条记录),我想确保它不会先尝试将其加载到内存中。
【问题讨论】:
-
您实际上将 UserName 和 UserNameAsLower 都存储在数据库中?
-
是的,如果您公开 IQueryable,而不是 IEnumerable,则服务调用将包括客户端应用的过滤器,直到执行点。
-
我用这个例子,不一定是真实的代码。如果你想要一个更复杂的版本:看看 ASP.NET 身份验证数据库表,它包含了所有这些,并且更多内容分布在各种表中。虽然问题更多的是它会在哪里执行还是在序列化时执行表中的 1 000 000 条记录,投影到列表,过滤掉或表中的 1 000 000 条记录,过滤掉,然后投影
-
它将使用所有应用的过滤器执行 LINQ 查询,并且只序列化返回结果。
-
操作顺序如下:客户端构造IQueryable,客户端枚举IQueryable,RIA将IQueryable.Expression转化为GET请求,服务器将GET请求解析为Expression树并重构IQueryable,服务器使用IQueryProvider执行表达式,服务器序列化回复客户
标签: .net wcf linq entity-framework-4 ria