System.Linq.Dynamic,EntitySQL和表达式树之间的区别

问题描述:

我目前正在大量使用实体框架的大型项目中工作。我们实现的部分功能是基于用户提供的过滤器对各种数据模型进行动态查询(过滤/排序)。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我会很感激任何好的理由。

我们在我们的项目中广泛使用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缓存使用编译表达式树生成的查询的? –