文章出處

.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 表達式有調用方法的操作就會造成全表查詢,使用時一定要注意這個坑。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()