【发布时间】: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