【问题标题】:WCF Ria, LINQ to Entity projection, filtering, deferred executionWCF Ria、LINQ to Entity 投影、过滤、延迟执行
【发布时间】: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


【解决方案1】:

RIA 将使用所有应用的过滤器执行 LINQ 查询,并且只将结果序列化。

操作顺序是这样的:客户端构造IQueryable,客户端枚举IQueryable,RIA将IQueryable.Expression转化为GET请求,服务器将GET请求解析为Expression树并重构IQueryable,服务器使用IQueryProvider执行表达式,服务器序列化响应给客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多