三表關聯: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 子句。
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。
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));
}
問題圓滿解決,分享以資參考。