我目前正在开发一个广泛使用Entity Framework的大型项目。我们实现的部分功能是基于用户提供的过滤器对各种数据模型进行动态查询(过滤/排序)。
为了达到这个目的,我最终使用System.Linq.Dynamic
,它允许我通过各种方式创建类似"SomeProperty.StartsWith(@P0)"
之类的基于字符串的过滤器,然后传递这些字符串(和话务员参数)到IQueryable<T>
(Where
等)的动态Linq扩展方法,以便它们对数据库执行,每个人都很高兴。
除了模糊之外,我当时不知道有什么其他方法可以做到这一点 Expression Trees的概念,说实话,我无法得到 围绕着他们 - 我花了几个星期的时间仔细研究一个使用表达式来实现动态查询的组件的反编译,我犹豫不决:)
另外,感觉就像我正在重新发明轮子的时候,我需要有效的功能已经由远比我自己更聪明的人在
System.Linq.Dynamic
扩展中编写。
现在当前的代码都可以很好地作为我的任何实体上的过滤,排序等的通用解决方案,我很高兴它随着我越来越熟悉EF我开始来了像
这样的事情我开始怀疑,鉴于System.Linq.Dynamic
将近6岁,并且在那段时间内没有真正做过任何事情,我错过了什么?或者,我错过了一些基本观点吗?
我应该咬紧牙关并移动我的代码库以使用EntitySQL
吗? (我认为这就像System.Linq.Dynamic
的精神继承者,或者我错了?)
或者我应该回去学习如何使用Expression Trees
,因为它们是未来的方式/所有酷孩子都这样做,等等?我不喜欢变化的粉丝,而且我喜欢有效的代码,但是我担心在未来的某些时候基于字符串的动态linq会变成一个死胡同而且我一直在使用它。
如果有人可以帮助澄清System.Linq.Dynamic
和EntitySQL
之间的差异,或者可以找出转移到Expression Trees
的任何合理理由,我会非常感激。
答案 0 :(得分:1)
我们在项目中广泛使用Dynamic Linq ... 它很干净,效果很好,但是如果您想要窥视或更改其代码,它会非常复杂。
使用Dynamic Linq和EF 6的组合我发现的一个问题是 EF 6使用查询缓存来执行更快的数据检索,并且在Dynamic Linq中构建的 where 查询方式不使用EF 6的此功能。因此我们必须更改使用查询缓存的位置。
这只是一个小例子,说动态Linq不适用于较新的EF版本。 如果你想使用像IQuerable这样的非类型集合,那么Dynamic Linq是一个很棒的解决方案,但它很难维护。
我希望你能在一个打字的环境中工作(IQueryable)。否则,您基本上需要修改Dynamic Linq才能真正利用EF 6。