文章出處
文章列表
.NET Core 遷移工作如火如荼,今天在使用 Entity Frameowork Core(又名EF Core)時寫了下面這樣的 LINQ 查詢表達式:
.Where(u => u.Id == new Guid(userId)).FirstOrDefaultAsync();
結果在 SQL Server Profiler 中發現竟然進行了全表查詢。
之后將 new Guid(userId) 從表達式中移出,保存于一個局部變量中,使用這個局部變量進行查詢,全表查詢問題就解決了。
var userGuid = new Guid(userId); var user = await users.Where(u => u.Id == userGuid).FirstOrDefaultAsync();
同事之前也遇到了同樣的問題,在表達式中調用計算時間的方法,也造成了全表查詢。
.Where(p => p.DateCreated > DateTime.Now.AddDays(-1))
解決方法也是將之從表達式中移出。
var startTime = DateTime.Now.AddDays(-1); Entities.Where(p => p.DateCreated > startTime);
根據目前遇到的情況推測,很可能在 Entity Framework Core 中只要 LINQ 表達式有調用方法的操作就會造成全表查詢,使用時一定要注意這個坑。
文章列表
全站熱搜