【问题标题】:Using an IQueryable in another IQueryable在另一个 IQueryable 中使用 IQueryable
【发布时间】:2017-08-29 07:42:43
【问题描述】:

我有一个扩展方法,它返回一个 IQueryable,用于获取公司产品,我只想在 IQueryable 中将其用作子查询,

public static class DBEntitiesCompanyExtensions {
   public static IQueryable<Product> GetCompanyProducts(this DBEntities db, int companyId)
   {
      return db.Products.Where(m => m.CompanyId == companyId);
   }
}

这就是我所说的,

using(var db = new DBEntities()) {
   var query = db.Companies.Select(m => new {
                CompanyName = m.Name,
                NumberOfProducts = db.GetCompanyProducts(m.CompanyId).Count()
   });    
}

我希望它可以工作,因为我的扩展方法返回一个 IQueryable,所以它可以在 IQueryable 中使用,我错了吗?

这就是我得到的,有可能让它工作吗?

System.NotSupportedException:LINQ to Entities 无法识别 方法'System.Linq.IQueryable`1 [WebProject.Models.Company] GetCompanyProducts(WebProject.Models.DBEntities, Int32)' 方法,并且该方法不能翻译成商店表达式。

【问题讨论】:

  • 它无法理解如何将db.GetCompanyProducts(m.CompanyId) 转换为SQL,这就是它失败的原因。根据我的知识,您无法真正封装它。加上Count 将评估可查询的
  • 它根本无法将IQueryable 结果转换为Expression tree,主要是由于嵌套的数据库上下文
  • @CallumLinington,是的,这是另一个问题,甚至不可能在我完成查询之前让它不评估,这是我代码的一部分,所以在那之后我还有其他条件,在这些条件之前评估查询会使其性能非常缓慢。
  • 说实话 - 如果我的 LINQ 变得复杂,我只需在代码中用 SQL 编写它,然后针对数据库启动它。我坚持 LINQ 不需要了解 SQL 的原则
  • @CallumLinington,我最好创建 sql 视图,谢谢。

标签: c# linq linq-to-entities iqueryable


【解决方案1】:

问题不在于IQueryable 中的IQueryable,因为您可以包含子查询,而不是像以前那样。

在您的示例中,整个 Select 表示为表达式树。在那个表达式树中有类似的东西:

CALL method DBEntitiesCompanyExtensions.GetCompanyProducts

现在 EF 应该以某种方式将其转换为 SQL SELECT 语句。它不能这样做,因为它不能“查看内部”GetCompanyProducts 方法并查看那里发生了什么。它也不能执行这个方法并对它的结果做任何事情。它返回IQueryable 的事实无济于事,并且不相关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2013-05-04
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多