在另一个 IQueryable 中使用一个 IQueryable

Using an IQueryable in another IQueryable

我有一个扩展方法,returns 一个 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()
   });    
}

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

这是我得到的,是否可以让它工作?

System.NotSupportedException: LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[WebProject.Models.Company] GetCompanyProducts(WebProject.Models.DBEntities, Int32)' method, and this method cannot be translated into a store expression.

问题不在 IQueryable 内部 IQueryable,因为您可以包含子查询,而不是像您那样。

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

CALL method DBEntitiesCompanyExtensions.GetCompanyProducts

现在 EF 应该以某种方式将其翻译成 SQL SELECT 语句。它不能那样做,因为它不能 "look inside" GetCompanyProducts 方法并查看那里发生了什么。它也不能执行这个方法并对它的结果做任何事情。它 returns IQueryable 的事实没有帮助,也没有关系。