最近專案底層全部使用了EFCORE ,但是實際操作中發現Func<T, bool>作為條件查詢都是全表掃描,現在不想大范圍更改底層,想了解下如何可以變通,以下是我的2個問題:
問題一 ,直接轉換?
Func<T, bool>物件轉換Expression<Func<T, bool>>物件?
問題二,不能轉換如何決議?
Func<T, bool>物件決議成Expression<Func<T, bool>>物件?
uj5u.com熱心網友回復:
你可以把Expression<Func<T, bool>>看成源代碼,而Func<T, bool>看成機器代碼。編譯很好實作,反編譯比較難。
而且就算你改寫成Expression<Func<T, bool>>,EF能不能執行也不一定。EF能執行的運算式只是一個子集,比如說多行代碼,回圈,if判斷,條件分支,呼叫本地函式,這些其實ef都不支持。
uj5u.com熱心網友回復:
不改底層,那么建議直接廢棄。uj5u.com熱心網友回復:
我換了種方式:
不直接用委托變運算式了。直接用運算式的 .Compile() 方法倒過來 也變相實作了。但是改動比之前多了。
uj5u.com熱心網友回復:
多謝 詳細解釋。
uj5u.com熱心網友回復:
Expression<Func<T, bool>> 是正解。光使用Func傳遞,那么就是先全表掃描,然后才進入func過濾。
通過運算式樹,可以將func拼接到sql。
你看一下
https://blog.csdn.net/hanjun0612/article/details/62887466
uj5u.com熱心網友回復:
是的,就是因為這樣我要把底層Func<T, bool>的引數全部換成Expression<Func<T, bool>>的。uj5u.com熱心網友回復:
寫個lamda轉換一下好了,改引數多費勁。
uj5u.com熱心網友回復:
這個咋寫?麻煩指點下。謝謝轉載請註明出處,本文鏈接:https://www.uj5u.com/net/26270.html
標籤:ASP.NET
上一篇:ASP.NET網站好像是被黑了
下一篇:winform下選擇檔案夾問題
