3

我目前正在大量使用實體框架的大型項目中工作。我們實現的部分功能是基於用戶提供的過濾器對各種數據模型進行動態查詢(過濾/排序)。System.Linq.Dynamic,EntitySQL和表達式樹之間的區別

爲了實現這一點,我結束了使用System.Linq.Dynamic,讓我,通過各種手段,創建基於字符串的過濾器似樣"SomeProperty.StartsWith(@P0)"等,再通過這些字符串(以及隨之而來的參數),以動態的LINQ擴展方法IQueryable<T>Where等),以便它們對數據庫執行並且每個人都很高興。

我不知道任何其他方式做到這一點的時候,除了爲Expression Trees一個模糊的概念 和說實話,我只是不能讓我的 他們周圍的頭 - 我花了幾個星期的鑽研組件的反編譯所使用表達式來實現動態查詢和我猶豫:)

加上它覺得我是重塑當我有效所需的功能遠遠聰明人比我已經寫輪,在System.Linq.Dynamic擴展。

現在當前代碼的所有作品非常好,作爲濾波廣義解,排序等,對我的任何實體,我用它足夠的幸福不過是我變得越來越熟悉,我EF開始遇到類似的事情

,我開始懷疑,因爲System.Linq.Dynamic是近6歲,並沒有真正有什麼用它做在那個時候,我我上遺漏了呢?我有沒有想過一些基本點?

  • 我應該硬着頭皮搬過來我的代碼庫使用EntitySQL? (我認爲這就像System.Linq.Dynamic的精神繼承者,或者我錯了嗎?)

  • 或者我應該回去學習如何使用Expression Trees因爲他們是未來的方式/所有的酷孩子都這樣做,等等?我不喜歡爲改變而改變,我喜歡可以運行的代碼,但我擔心未來的某些時候,基於字符串的動態linq會成爲一個死衚衕,我堅持使用它。

如果有人可以幫助System.Linq.DynamicEntitySQL之間明確的差異,或者可以識別移動到Expression Trees我會很感激任何好的理由。

回答

1

我們在我們的項目中廣泛使用Dynamic Linq ... 它乾淨而且運行良好,但是如果您想窺視或更改任何代碼,它非常複雜。

一個我發現使用動態的LINQ的組合和EF 6的問題是 EF 6使用查詢緩存來進行更快的數據檢索和方式,其中內置在動態的LINQ查詢不使用此EF 6的功能。因此,我們必須更改使用查詢緩存的位置。

這只是一個小例子,說動態Linq不適用於較新的EF版本。 動態Linq是一個很好的解決方案,如果你想使用像IQuerable這樣的非類型集合,但它很難維護。

我希望你能在類型化的環境(IQueryable)中工作。否則,基本上你需要修改Dynamic Linq來真正利用EF 6.

+0

感謝您的見解。我們希望升級到EF6,所以我想我需要仔細看看Entity SQL。 –

+0

你是如何着手讓EF6緩存使用編譯表達式樹生成的查詢的? –

相關問題