Различия между System.Linq.Dynamic, EntitySQL и деревьями выражений

В настоящее время я работаю над большим проектом, который широко использует Entity Framework. Часть реализованной нами функциональности - это динамический запрос (фильтр / сортировка) различных моделей данных на основе пользовательских фильтров.

Чтобы достичь этого, я использовал System.Linq.Dynamic что позволяет мне различными способами создавать строковые фильтры, такие как "SomeProperty.StartsWith(@P0)" и так далее, а затем передать эти строки (и сопутствующие параметры) в методы расширения Dynamic Linq для IQueryable<T> (Whereи т. д.), чтобы они выполнялись против базы данных, и все были довольны.

В то время я не знал другого способа сделать это, кроме смутного представления о деревьях выражений, и, честно говоря, я просто не мог обдумать их - я провел несколько недель, размышляя над декомпиляцией компонента, который использовал выражения для реализации динамических запросов, и я отказался:)

Кроме того, мне казалось, что я заново изобретаю колесо, когда функциональность, в которой я нуждался, была уже написана гораздо умнее людей, чем я, в System.Linq.Dynamic расширения.

Теперь весь текущий код довольно хорошо работает как обобщенное решение для фильтрации, сортировки и т. Д. Для любой из моих сущностей, и я достаточно доволен этим, однако, когда я стал все больше и больше знакомиться с EF, я начал сталкиваться с такими вещами, как

И я начал задаваться вопросом, учитывая, что System.Linq.Dynamic мне почти 6 лет, и я ничего с этим не сделал за это время, я что-то упустил? или я пропустил какой-то фундаментальный момент?

  • Должен ли я прикусить пулю и переместить мою кодовую базу для использования EntitySQL? (Я предполагаю, что это как духовный преемник System.Linq.Dynamicили я не прав?)

  • Или я должен вернуться и научиться пользоваться Expression Trees потому что они - путь будущего / все крутые дети делают это, и т.д.? Я не фанат изменений ради изменений, и мне нравится код, который работает, но я беспокоюсь, что в какой-то момент в будущем динамический linq на основе строк станет тупиком, и я застряну, используя его.

Если кто-то может помочь уточнить различия между System.Linq.Dynamic а также EntitySQLили может определить любую вескую причину для перехода к Expression Trees Я действительно ценю это.

1 ответ

Мы широко используем Dynamic Linq в нашем проекте... Он чистый и хорошо работает, но очень сложный, если вы захотите заглянуть или изменить что-либо в его коде.

Одна из проблем, которые я обнаружил, используя комбинацию Dynamic Linq и EF 6, заключается в том, что EF 6 использует кэширование запросов для более быстрого поиска данных, а также то, что встроенный в Dynamic Linq запрос не использует эту функцию EF 6. Поэтому мы нужно изменить, где использовать кэширование запросов.

Это лишь небольшой пример того, что Dynamic Linq не предназначен для более новых версий EF. Dynamic Linq - замечательное решение, если вы хотите работать с нетипизированной коллекцией, такой как IQuerable, но ее очень сложно поддерживать.

Я надеюсь, что вы будете работать в типизированной среде (IQueryable). Иначе, по сути, вам нужно изменить Dynamic Linq, чтобы действительно использовать преимущества EF 6.

Другие вопросы по тегам