繁体   English   中英

在另一个 IQueryable 中使用一个 IQueryable

[英]Using an IQueryable in another IQueryable

我有一个扩展方法,它返回一个 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)' 方法,并且此方法无法转换为存储表达式.

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

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

CALL method DBEntitiesCompanyExtensions.GetCompanyProducts

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

而不是使用 IQueryable 你应该创建一个表达式谓词并在连接到数据源的 IQueryable object 中使用

object 看起来像这样:

Expression<Func<Person, bool>> predicate = x => x.Name == "Adi";

var data = await queryable.Where(predicate).ToListAsync();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM