2010-11-02 108 views
2

我想将一组条件where子句附加到ObjectSet的末尾。然而,该条款没有得到执行,而不是原来的运行查询,例如:如何将Where子句附加到实体框架ObjectSet

using (Entities context = new Entities()){ 
var q = context.AuditLogs; 
q.Where(o => o.WebsiteId == 1); 
} 

的地方不执行条款和整个结果集返回 我可以代替使用的IQueryable为:

var q = context.AuditLogs.AsQueryable(); 
q = q.Where(o => o.WebsiteId == 1); 

但是,这使我失去了使用能力。包括急于加载我的相关实体。

+3

在你的第一个例子,你是不是设置●要q.Where的结果(O => o.WebsiteId == 1); – dotariel 2010-11-02 16:17:09

+0

是的,你不能这样做(至少它不允许我这样做),因为它不能隐式地从ObjectSet转换为Iqueryable – januszstabik 2010-11-02 16:33:16

回答

6

不,它不会。在执行查询之前的任何时候,你仍然可以将它转换回的ObjectQuery < T>和调用的方法,如包括它

var query = context.AuditLogs.AsQueryable(); 
query = query.Where(o => o.WebsiteId == 1); 
var auditLog = ((ObjectQuery<AuditLog>)query).Include("yourNavPropertyName") 
              .ToList(); 

如果你的目的是要建立一个标准增量,那么其他的办法是利用EntitySQL的QueryBuilder方法:

var query = context.AuditLogs.Where("it.WebsiteId = 1"); 
query = query.Where("..."); 
var auditLog = query.Include("yourNavPropertyName") 
        .ToList(); 
+0

以避免最终转换,你可以做一些像context.AuditLogs.Include(“navProp” ).AsQueryable(); ?或者仍然会执行整个结果集,然后将其过滤到客户端? – JoeBrockhaus 2012-10-17 20:41:03

1

只是一些良好的老式LINQ w ^在这里就够了。假设你有一个名为SiteOwner属性,你可以完成你的努力与下面的查询做

using (Entities context = new Entities()){ 
    var webSites = from sites in context.AuditLogs.Include("SiteOwner") 
       where sites.WebSiteId == 1 
       select sites; 
} 
+0

对不起,这不是我正在寻找的,只包括使用ObjectSet时的作品,而我需要IQueryable和Object之间的功能组合,如Morteza的答案 – januszstabik 2010-11-03 08:37:45