动态查询的最佳选择?

| 我正在努力将旧的应用程序从WebForms移植到MVC,该过程的一部分是删除现有的数据层,将逻辑从存储过程转移到代码。因为最初我只使用基本的C#SQL函数(System.Data.SqlClient),所以我使用了轻量级的伪ORM(PetaPoco),它仅将SQL语句作为字符串并执行它。建立动态查询在SQL中的工作原理几乎相同-许多条件条件会添加和删除其他代码(平均查询具有约30个过滤器)。 因此,环顾四周后,我发现了一些选择: 一堆字符串和条件,可在需要时添加查询的位。真的很讨厌,尤其是当查询变得复杂时,如果存在更好的解决方案,我就不想追求。 一堆使用L2E的条件句。看起来更优雅,但我测试过L2E太肿,总体而言是一次糟糕的体验。我可以在L2S中做同样的事情吗?如果是这样,那么L2S会在接下来的5-10年内持续存在吗? 使用PredicateBuilder。仍在研究有关L2S的相同问题。 编辑:我也可以坚持使用现有的存储过程模型,但是无论如何我都必须重写它们,因此,我仍然需要做一些工作,所以看看其他选项也不会有什么坏处。 还有其他选择吗?任何人都可以对任何一种提到的方法都具有一定经验的人-主要是,您选择的方法是否使您想要构建时间机器并杀死您来实现它?     
已邀请:
        我看一下LLBLGen。它生成的代码非常好并且可以自定义。他们还提供了一个强大的linq提供程序,可以帮助您进行查询。我将其用于几个大型项目,并感到非常高兴。 http://www.llblgen.com/     
        在我看来,L2S和L2E都无法生成有效的SQL代码,尤其是在涉及复杂查询时。即使在某些相对简单的情况下,通过这两种方法之一生成查询也会产生效率低下的SQL代码,这是一个示例:为什么这种额外的联接会增加查询的数量? 话虽这么说,如果您使用的是SQL Server L2S是一个更好的选择,因为L2E可以处理任何数据库。因此,L2E将生成效率低下的SQL代码。还要记住的另一点是L2S或L2E都不会利用tempDB,即生成临时表或表变量或CTE。 我将重新编写存储过程,并尽可能地优化它们,并使用L2S / L2E进行简单查询,这将生成到服务器的一次往返(应尽可能低),并确保SQL Server使用的执行计划是最有效的(即使用索引等)。 哈萨那     
        并不是真正的答案,但是评论太久了: 我已经使用“ SQL的连接部分”方法构建了一个中型Web应用程序,并且目前正在使用L2E做类似的工作。 我发现通过一些自我控制,concatenate-pices-of-sql方法还不错。当然,请使用参数化查询,不要尝试将用户输入直接粘贴到SQL中。 我对L2E方法的理解一直在慢慢增长。它为您提供了类型安全性,尽管您必须做一些与SQL可能做的事“向后”的事情-例如
WHERE X IN (...)
构造。但是到目前为止,我还没有遇到L2E无法处理的任何问题。 我觉得如果其他人大量参与,L2E方法将更易于维护。 您是否有L2E的“膨胀”有问题的实际用例?还是您觉得框架在幕后做得太多呢? 一开始我肯定有这种感觉(好吧,还是这样做),当然也不喜欢阅读生成的SQL(尤其是与上一个项目中的手写SQL相比),但是到目前为止,L2E在仅在实际需要时才击中数据库。 另一个问题是您正在使用什么数据库,以及它的L2E绑定是最新的。如果您使用的是SQL Server,则没有问题。 MySql可能会更加脆弱。 L2E的出色之处在于它与VStudio的良好集成以及VStudio从数据库自动构建实体模型的能力。不确定对非MS DB后端的支持程度如何。     

要回复问题请先登录注册