簡體   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