在另一个 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
的事实没有帮助,也没有关系。
我有一个扩展方法,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
的事实没有帮助,也没有关系。