首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

LINQ to SQL 查詢本地集合錯誤解決:Contains 與 AsEnumerable 實戰

     編輯:關於.NET

問題場景

三表關聯:Paper (論文) → Magazine (期刊) → MagazineSubjectClass (期刊學科分類)。需求:給定學科分類字串陣列,查詢發表於這些分類期刊上的論文。

初始嘗試與錯誤

var magazines = db.MagazineSubjectClasses
    .Where(q => subjectClasses.Contains(q.SubjectClass))
    .Select(q => q.Magazine).Distinct();

query = query.Where(p => magazines.Contains(p.Magazine));

錯誤:Queries with local collections are not supported。原因:LINQ 延遲執行導致 magazines 為 IQueryable,無法直接轉譯為 SQL 的 IN 子句。

第一步修正:ToList() 具體化集合

var magazines = db.MagazineSubjectClasses
    .Where(q => subjectClasses.Contains(q.SubjectClass))
    .Select(q => q.Magazine).Distinct().ToList();

新錯誤:Method 'Boolean Contains(Magazine)' has no supported translation to SQL。LINQ to SQL 無法將自訂實體型別的 Contains 轉譯為 SQL。

最終解決:AsEnumerable() 切換至本地執行

query = query.Where(p => magazines.AsEnumerable().Contains(p.Magazine));

AsEnumerable() 將 IQueryable 轉為 IEnumerable,強制後續 Contains 在記憶體中執行(LINQ to Objects),繞過 SQL 轉譯限制。

原理總結

  • IQueryable:嘗試轉譯為 SQL,在資料庫端執行。
  • IEnumerable:在本地記憶體執行(LINQ to Objects)。
  • 複雜查詢中,靈活切換兩者是解決轉譯失敗的關鍵。

完整修正代碼

IList<Magazine> magazines = db.Magazines.ToList();
if (subjectClasses != null && subjectClasses.Length > 0) {
    magazines = db.MagazineSubjectClasses
        .Where(q => subjectClasses.Contains(q.SubjectClass))
        .Select(q => q.Magazine).Distinct().ToList();

    query = query.Where(p => magazines.AsEnumerable().Contains(p.Magazine));
}

問題圓滿解決,分享以資參考。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved