2011-09-16 41 views
0

比方说,我有以下实体WCF RIA,LINQ到实体投影,过滤,延迟执行

  • 用户

    • 用户名
    • 用户名
    • UserNameAsLower
    • 简介(导航属性)
  • 档案

    • 用户名
    • 电子邮件
    • EmailAsLower
    • 语言

,我想返回一个统一的目标,让我们把它叫做UserDTO,但删除一些我们不希望用户看到的字段(AsLower stuff)

  • UserDTO
    • 用户名
    • 用户名
    • 电子邮件
    • 语言

如果我写一个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; 
} 

我问的原因是,如果它背后的数据库表恰好是真正的大(数百万条记录),我想,以确保它不会尝试它第一次加载到内存中。

+0

你实际上是在你的数据库中存储UserName和UserNameAsLower? – Jeff

+0

是的,如果您公开IQueryable而不是IEnumerable,则服务调用将包含客户端应用到执行点的过滤器。 – Jeff

+0

我正在使用这个例子,不一定是真正的代码。如果你想要一个更复杂的版本:看看ASP.NET身份验证数据库表,它获得了所有这些,并且更多地分布在各种表中。 但问题是更多的将它执行的地方或在表中序列化执行 1 000 000的记录,预计将列出,过滤出表 OR 1 000 000条记录,过滤掉,然后再投影 – Rickster

回答

1

RIA将对所有应用的过滤器执行LINQ查询,并仅序列化结果。客户端构造IQueryable,客户端枚举IQueryable,RIA将IQueryable.Expression转换为GET请求,服务器将GET请求分解为表达式树并重构IQueryable,服务器使用IQueryProvider执行表达式,服务器序列化客户端响应。