【问题标题】:Differences between System.Linq.Dynamic, EntitySQL and Expression TreesSystem.Linq.Dynamic、EntitySQL 和表达式树之间的区别
【发布时间】:2013-12-14 17:41:17
【问题描述】:

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

为了实现这一点,我最终使用了System.Linq.Dynamic,它允许我通过各种方式创建基于字符串的过滤器,例如"SomeProperty.StartsWith(@P0)" 等,然后将这些字符串(和伴随的参数)传递给 Dynamic 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,我将不胜感激。

【问题讨论】:

    标签: entity-framework linq-to-entities dynamic-linq entity-sql


    【解决方案1】:

    我们在项目中广泛使用 Dynamic Linq... 它干净而且运行良好,但如果你想窥探或更改它的任何代码,它会非常复杂。

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

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

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

    【讨论】:

    • 感谢您的见解。我们正在寻求升级到 EF6,所以我想我需要仔细研究一下 Entity SQL。
    • 您是如何让 EF6 缓存使用编译表达式树生成的查询的?
    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2013-09-18
    • 1970-01-01
    • 2021-01-24
    • 2016-07-07
    • 2018-08-22
    • 2012-09-24
    • 1970-01-01
    相关资源
    最近更新 更多