Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态查询的最佳选择?_C#_Petapoco - Fatal编程技术网

C# 动态查询的最佳选择?

C# 动态查询的最佳选择?,c#,petapoco,C#,Petapoco,我正在将一个旧的应用程序从WebForms移植到MVC,这个过程的一部分是删除现有的数据层,将逻辑从存储过程转移到代码。由于我最初只使用基本的C#SQL函数(System.Data.SqlClient),所以我使用了轻量级的伪ORM(),它只将SQL语句作为字符串并执行。在SQL中,构建动态查询的工作原理大致相同——许多条件可以添加和删除额外的代码(平均查询有30个过滤器) 因此,在环顾四周之后,我找到了一些选择: 一组字符串和条件,根据需要添加查询位。非常糟糕,尤其是当查询变得复杂时,如果存

我正在将一个旧的应用程序从WebForms移植到MVC,这个过程的一部分是删除现有的数据层,将逻辑从存储过程转移到代码。由于我最初只使用基本的C#SQL函数(System.Data.SqlClient),所以我使用了轻量级的伪ORM(),它只将SQL语句作为字符串并执行。在SQL中,构建动态查询的工作原理大致相同——许多条件可以添加和删除额外的代码(平均查询有30个过滤器)

因此,在环顾四周之后,我找到了一些选择:

  • 一组字符串和条件,根据需要添加查询位。非常糟糕,尤其是当查询变得复杂时,如果存在更好的解决方案,我就不想追求这一点
  • 。看起来更优雅,但我测试了L2E,总体来说它太臃肿了,这是一次可怕的经历。我能在L2S里做同样的事情吗?如果是这样,L2是否会在未来5-10年内继续存在
  • 使用一个。仍然在研究这个,关于L2的同样问题
  • 编辑:我也可以只使用现有的存储过程模型,但无论如何我都必须重写它们,因此查看其他选项不会有什么坏处,因为我仍然需要做腿部工作

还有其他选择吗?有没有人能在上面提到的任何一种方法上有一些经验呢?主要是,你选择的方法是否让你想要构建一台时间机器,并在实现它时杀死你呢?

我想看看LLBLGen。它生成的代码非常好并且可以自定义。它们还提供了一个健壮的linq提供程序,可以帮助您进行查询。我用它做了几个大项目,非常高兴


这不是一个真正的答案,但评论太长了:

我已经使用“连接SQL片段”方法构建了一个中型web应用程序,目前正在进行类似的工作,但使用L2E

我发现,通过一些自我控制,sql方法的连接图片并没有那么糟糕。当然,使用参数化查询,不要试图将用户输入直接粘贴到SQL中

不过,我慢慢地对L2E方法产生了欣赏。它为您提供了类型安全性,尽管您确实需要从使用SQL的方式“向后”执行某些操作,例如
WHERE X IN(…)
构造。但到目前为止,我还没有击中L2E无法处理的任何东西

我觉得如果其他人参与其中,L2E方法会更容易维护

您是否有L2E的“膨胀”是一个问题的实际用例?或者只是一种普遍的不适感,你觉得框架在幕后做得太多了

我一开始肯定有这种感觉(好的,现在仍然有),当然也不喜欢阅读生成的SQL(特别是与上一个项目中的手写SQL相比),但到目前为止,我发现L2E非常好,只在实际需要时才点击DB


另一个问题是您使用的数据库是什么,以及它的L2E绑定是如何更新的。如果您使用的是SQL Server,那么没有问题。不过MySql可能更脆弱。L2E的一大优势来自于它与VStudio的良好集成,以及VStudio从数据库自动构建实体模型的能力。不确定对非MS DB后端的支持有多好。

在我看来,L2S和L2E都不能生成高效的SQL代码,尤其是在涉及复杂查询时。即使在一些相对简单的情况下,通过这两种方法中的任何一种生成查询也会产生低效的SQL代码,下面是一个示例:

也就是说,如果您使用的是SQLServerL2S,那么L2E是一个更好的选择,因为L2E是用来处理任何数据库的;因此L2E将生成低效的SQL代码。还要记住的另一点是,L2S或L2E都不会利用tempDB,即生成临时表或表变量或CTE

我将重新编写存储过程,尽可能优化它们,并使用L2S/L2E进行简单查询,这将生成到服务器的一次往返(这应该尽可能低),还将确保SQL server使用的执行计划是最有效的(即使用索引等)


哈萨纳因

只有我的两分钱,当EF4问世时,我真的很兴奋。在过去一年使用它之后,我对膨胀、某些建模场景的复杂性以及生成的SQL非常不满意。我再也不打算使用EF了——存储过程的顶层都是精简API。没有回答你的问题-但我想我会加上我的两分钱。从.NET3.5开始,流行的观点认为L2S生成的sql比L2E更高效。我不知道随着L2E的更新(包括.NET4.0和更高版本),这种情况是否发生了变化。在L2S中测试相同的条件应该相当简单。您是否考虑过只保留当前的存储过程?@jlnorsworthy-这当然是一个选项,我应该在上面添加它(我将在中编辑它)。重要的一点是,无论我选择哪种方式,它们都需要重新编写(它们过于复杂,速度慢得令人痛苦),所以现在是一个很好的时机来四处逛逛,看看备选方案是什么样子。你能详细说明一下“L2E总体上太臃肿了,这是一次糟糕的体验吗?也许这应该是社区维基?似乎没有一个具体的答案。。。