以下教科書 Join 查詢運行良好:
var list = from family in db.Families.Where(f => !f.isDeleted)
join member in db.Members.Where(m => !m.isDeleted)
on family.Id equals member.FamilyID
select new { family = family.LastName, member = member.DisplayName };
list是一個IQueryable: {Microsoft.FrameworkCore.Query.Internal.EntityQueryable<<>f__AnonymousType0<string, string>>}我可以打電話list.ToList()。
但是,如果我在第一個中使用謂詞,而不是使用 lambda,Where如下所示:
Predicate<Family> query = f => !f.isDeleted;
var list = from family in db.Families.Where(new Func<Family, bool>(query))
join member in db.Members.Where(m => !m.isDeleted)
on family.Id equals member.FamilyID
select new { family = family.LastName, member = member.DisplayName };
然后list變成 a[IEnumerable]: {System.Linq.Enumerable.<JoinIterator>d__105<Family, Member, short, <>f__AnonymousType0<string, string>>}并且結果視圖拋出“已經有一個與此連接關聯的打開的 DataReader 必須先關閉。”。
我無法再重現它,但我確定有時結果視圖會拋出“資料為空”例外。
我需要使我的查詢成為一個變數,因為所需的確切查詢取決于其他一些條件。為什么使用Predicate賦值會導致型別list不同,我該如何修復錯誤?
uj5u.com熱心網友回復:
您正在呼叫 的兩個截然不同的多載Where。在第一個代碼片段中,您正在呼叫:
Where<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>)
此多載將您的 lambda 運算式轉換為 SQL 查詢并在資料庫上運行它。
在第二個代碼片段中,您正在呼叫
Where<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>)
第二個多載是 LINQ to Objects Where,它根本不知道您的資料庫。它適用于所有IEnumerable<T>s。
您應該創建一個Expression<Func<Family, bool>>并將其傳入:
Expression<Func<Family, bool>> query = f => !f.isDeleted;
var list = from family in db.Families.Where(query)
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350458.html
下一篇:EFCore支持欄位字串陣列
