我有一个扩展方法,它返回一个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无法识别 方法&#39; System.Linq.IQueryable`1 [WebProject.Models.Company] GetCompanyProducts(WebProject.Models.DBEntities,Int32)&#39; 方法,并且此方法无法转换为商店表达式。
答案 0 :(得分:1)
$.get
内的问题不是IQueryable
,因为你可以不像你那样包含子查询。
在您的示例中,整个IQueryable
表示为表达式树。在那个表达式树中有类似的东西:
Select
现在EF应该以某种方式将其转换为SQL SELECT语句。它无法做到这一点,因为它无法“查看”CALL method DBEntitiesCompanyExtensions.GetCompanyProducts
方法,看看那里发生了什么。它也不能执行这种方法并对其结果做任何事情。它返回GetCompanyProducts
的事实没有帮助,也没有关系。