实体框架在这种情况下不提供任何优势。事实上,它严格限制。
可以编写一个通用的 SortHelper、PagerHelper、FilterHelper 等,它将表达式树作为 IQuerable 并应用您想要的排序。这种泛型编程很棒,因为它避免了 SQL 注入。
但是,如果您使用实体框架作为查询生成器,则必须使用反射来生成实体数据模型。此外,您必须决定如何执行开放式选择语句。此外,您将依赖于 Entity Framework 如何表示和评估查询,这仍然不如 5.0 版的 ORM 应有的强大!例如,没有很好的方法来表示右连接,如果你想生成体面的 SQL,就必须始终将它们表示为左连接。另一个限制是,如果要编写投影,则需要生成一个匿名类。.NET 没有从内存中卸载类型的好方法,并且您在 AppDomain 中生成的每个类型都保存在内存中,直到 AppDomain 被卸载。这就是 F# 3.0 对其 F# 类型提供程序 API 使用类型擦除的原因,
此外,Entity Framework 不会进行任何类型的严肃分析来确定表达式是否可以转换,例如 SAT 求解。
我的答案基于现实生活经验,构建了您所描述的确切应用程序,然后是一些。该应用程序允许业务分析师以可视方式编写查询并将查询组合在一起。
也就是说,我确实建议学习 Entity Framework 的设计词汇。我已经转而使用非常相似的词汇,即使我不使用实体框架。例如,导航属性。我不称它们为属性,因为对于那些使用对象查询语言并且在可视查询语言中没有意义的人来说,这是一种面向对象的抽象。我称它们为路径。但我喜欢 Any() 运算符来暗示左连接,以及 Include()。那些小小的建模想法对我来说很有价值。