【问题标题】:How to append a where clause to an Entity Framework ObjectSet如何将 where 子句附加到实体框架对象集
【发布时间】:2010-11-02 16:15:17
【问题描述】:

我想将一组条件 where 子句附加到 ObjectSet 的末尾。但是,子句不会执行,而是运行原始查询,例如:

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

where子句不执行,返回完整的结果集 我可以改为使用 IQueryAble,如下所示:

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

但是,这让我失去了使用 .Include 来急切加载我的相关实体的能力。

【问题讨论】:

  • 在您的第一个示例中,您没有将 q 设置为 q.Where(o => o.WebsiteId == 1);
  • 是的,你不能这样做(至少它不允许我这样做)因为它不能从 ObjectSet 隐式转换为 Iqueryable

标签: c# linq linq-to-entities entity-framework-4


【解决方案1】:

不,不会。在执行查询之前的任何时候,您仍然可以将其转换回 ObjectQuery 并在其上调用 Include 之类的方法:

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

如果您的意图是逐步建立标准,那么另一个选择是利用 EntitySQLQueryBuilder 方法:

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

【讨论】:

  • 为了避免最后的演员表,你能做一些类似 context.AuditLogs.Include("navProp").AsQueryable(); ?还是会继续执行整个结果集然后在客户端过滤它?
【解决方案2】:

这里只需要一些好的老式 linq 就足够了。假设您有一个名为 SiteOwner 的属性,您可以使用以下查询完成您尝试做的事情

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

【讨论】:

  • 抱歉,这不是我想要的,仅在使用 ObjectSet 时才有效,而我需要在 Morteza 的回答中结合 IQueryable 和 Object set 之间的功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2011-10-21
  • 2010-10-06
  • 1970-01-01
相关资源
最近更新 更多