[英]Differences between System.Linq.Dynamic, EntitySQL and Expression Trees
我目前正在開發一個廣泛使用Entity Framework的大型項目。 我們實現的部分功能是基於用戶提供的過濾器對各種數據模型進行動態查詢(過濾/排序)。
為了實現這一點,我最終使用了System.Linq.Dynamic
,它允許我通過各種方式創建類似"SomeProperty.StartsWith(@P0)"
類的基於字符串的過濾器,然后傳遞這些字符串(和話務員參數) )為IQueryable<T>
( Where
等)的Dynamic Linq擴展方法,以便它們對數據庫執行,每個人都很高興。
當時除了表達樹的模糊概念之外,我還不知道有什么其他方法可以做到這一點,說實話,我無法理解他們 - 我花了幾個星期的時間仔細閱讀使用過的組件的反編譯用於實現動態查詢的表達式,我猶豫不決:)
另外,當我需要有效的功能已經由遠比我自己更聰明的人在
System.Linq.Dynamic
擴展中編寫時,感覺我正在重新發明輪子。
現在,當前的代碼都可以很好地作為我的任何實體上的過濾,排序等的通用解決方案,我很高興它隨着我越來越熟悉EF我開始遇到像
我開始懷疑,鑒於System.Linq.Dynamic
已經將近6年了,並且在那段時間里沒有真正做過任何事情, 我錯過了什么嗎? 或者, 我錯過了一些基本點嗎?
我應該咬緊牙關並移動我的代碼庫來使用EntitySQL
嗎? (我認為這就像System.Linq.Dynamic
的精神繼承者,或者我錯了?)
或者我應該回去學習如何使用Expression Trees
因為它們是未來的方式/所有酷孩子都這樣做,等等? 我不喜歡變化的粉絲,我喜歡有效的代碼,但是我擔心在未來的某些時候基於字符串的動態linq會變成一個死胡同,而我卻堅持使用它。
如果有人可以幫助澄清System.Linq.Dynamic
和EntitySQL
之間的差異,或者可以找出轉移到Expression Trees
任何好理由,我真的很感激。
我們在我們的項目中廣泛使用Dynamic Linq ...它很干凈並且運行良好,但如果您想窺視或更改其代碼,它會非常復雜。
其中一個我發現使用動態LINQ和EF 6的組合問題是EF 6使用查詢緩存來進行更快的數據檢索和那里是建立在動態的LINQ查詢不使用EF 6.因此,我們的這一功能的方式必須更改使用查詢緩存的位置。
這只是一個小例子,說動態Linq不適用於較新的EF版本。 如果你想使用像IQuerable這樣的非類型集合,那么Dynamic Linq是一個很棒的解決方案,但它很難維護。
我希望你能在一個打字的環境中工作(IQueryable)。 否則,您基本上需要修改Dynamic Linq才能真正利用EF 6。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.