4

我目前正在开展一个广泛使用实体框架的大型项目。我们实现的部分功能是基于用户提供的过滤器对各种数据模型进行动态查询(过滤器/排序)。

为了实现这一点,我最终使用System.Linq.Dynamicwhich 允许我通过各种方式创建基于字符串的过滤器,例如 like 等"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.DynamicEntitySQL或者可以找出任何充分的理由来移动,Expression Trees我将非常感激。

4

1 回答 1

2

我们在我们的项目中广泛使用 Dynamic Linq……它很干净而且效果很好,但是如果你想窥视或更改它的任何代码,它会非常复杂。

我发现使用 Dynamic Linq 和 EF 6 组合的问题之一是 EF 6 使用查询缓存来执行更快的数据检索,而 Dynamic Linq 中内置的查询方式使用 EF 6 的此功能。所以我们必须更改使用查询缓存的位置。

这只是一个小例子,说明 Dynamic Linq 不适用于较新的 EF 版本。如果您想使用像 IQuerable 这样的无类型集合,Dynamic Linq 是一个很好的解决方案,但它很难维护。

我希望你能在类型化的环境中工作(IQueryable)。否则,基本上您需要修改 Dynamic Linq 才能真正利用 EF 6。

于 2014-02-12T13:34:09.217 回答