The LINQ expression '****' could not be translated and will be evaluated locally.

The LINQ expression 'Contains([x].ExamId)' could not be translated and will be evaluated locally.

今天看日誌的時候,看到一條這樣的警告,翻譯過來是Linq 表達式無法翻譯成sql,將在本地計算,就是因爲這個Contains方法,沒辦法解析成sql語句,將會跳過這個條件,將數據拉到內存,然後再執行這個操作。這是個很嚴重的問題,因爲數據量大的話,將會很吃內存,故想辦法處理。

我們一般會在兩種情況下用Contains方法,一個是是判斷字符串中是否存在某個片段,實現類似LIKE操作,另外就是判斷某一個值是否在某個集合中,類似IN操作。

對字符串操作很簡單,EF這個類提供了Contains和Like兩個方法,EF在using Microsoft.EntityFrameworkCore;名字空間下,用法如下:

 對於第二種情況,願意是我直接把查詢這個集合的代碼寫在LINQ裏面,像下面這樣:

後來我單獨先取出來,然後Tolist(),   在放到這個位置,發現問題竟然解決了,鬱悶的是上面的examPage已經被拉到內存中,我只是單獨取出來一列。

下面是解析出來的sql語句 

發佈了31 篇原創文章 · 獲贊 57 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章