繁体   English   中英

我们可以将所有SQL脚本转换为Linq-to-SQL表达式,还是有任何限制?

[英]Can we convert all SQL scripts to Linq-to-SQL expressions or there is any limitation?

我想将我的所有db存储过程转换为linq到sql表达式,这项工作是否有任何限制? 你必须注意到我的数据库中有一些复杂的查询。

Linq to SQL不支持SQL Server的几个功能:

  • 批量更新(除非您使用非标准扩展);
  • 表值参数;
  • CLR类型,包括空间类型和hierarchyid ;
  • DML语句(我特意考虑表变量和临时表);
  • OUTPUT INTO条款;
  • MERGE声明;
  • 递归公用表表达式,即嵌套集上的分层查询;
  • 使用SET ROWCOUNT优化分页查询( ROW_NUMBER不是最有效的);
  • 某些窗口函数如DENSE_RANKNTILE ;
  • 游标 - 虽然这些显然应该避免,但有时你确实需要它们;
  • 使用ROLLUPCUBECOMPUTE等的分析查询
  • 统计汇总,如STDEVVAR等。
  • PIVOTUNPIVOT查询;
  • XML列和集成的XPath;
  • ...等等...

有了这些东西,你可以在技术上编写自己的扩展方法,解析表达式树并实际生成正确的SQL,但这不适用于上述所有 ,即使它是一个可行的选项,它通常只是更容易编写SQL并调用命令或存储过程。 有一个原因, DataContext为您提供ExecuteCommandExecuteQueryExecuteMethodCall方法。

正如我在过去所说的那样,像Linq to SQL这样的ORM是很好的工具,但它们不是银子弹。 我发现对于规模较大,数据库较多的项目,L2S通常可以处理大约95%的任务,但对于其他5%,你需要编写UDF或存储过程,有时甚至完全绕过DataContext (对象跟踪会不适合服务器触发器)。

对于较小/较简单的项目,很有可能您可以在Linq to SQL中执行所有操作。 你是否应该完全是一个不同的问题,而且我不打算在这里回答。

我发现在几乎所有使用L2S完成新项目的情况下,我都完全不需要存储过程。 事实上,很多情况下我会被迫使用存储过程,例如多变量过滤器,我发现通过在LINQ中动态构建查询,我实际上在绝大多数情况下获得了更好的查询因为我不需要在查询中包含那些在存储过程中被翻译为“不关心”的部分。 所以,从我的角度来看,是的 - 您应该能够将存储过程转换为LINQ。

想到一个更好的问题,你应该将存储过程转换为LINQ吗? 我认为,答案取决于项目的状态,您对C#/ VB和LI​​NQ vs SQL的相对专业知识,转换的大小等。在现有项目中,我只会努力改进代码库的可维护性或可扩展性,或者如果我进行了重大更改,新代码将受益。 在后一种情况下,您可以选择以递增方式将代码移动到纯LINQ,同时触摸它以进行更改。 您可以将存储过程与LINQ一起使用,因此您可能不需要更改它以使用LINQ。

我不是这种方法的粉丝。 这是一项重大的体系结构更改,因为您现在正在删除先前用于获得解耦优势的主要界面层。

使用存储过程,您已经选择了数据库公开的接口。 现在,您需要在应用程序存储过程中为所有基础表/视图而不是EXECUTE授予用户SELECT权限,并且可能需要在表/视图的列级别限制列读取权限。 现在,您需要在较低级别重新实现存储过程先前使用单个隐式EXECUTE权限实现的每个显式基础表/视图/列权限。

而在数据库预期的服务可以通过适当的存储过程库存进行枚举之前,现在潜在的数据库操作仅限于暴露的表/视图/列,大大增加了耦合和难以估计数据库重构的范围变化的可能性。和功能实现。

除非存在难以创建/维护存储过程接口的特定情况,否则我认为整体更改基于SP的工作架构几乎没有什么好处。 如果LINQ由于应用程序级数据耦合(例如将本机集合连接到数据库)而生成更好的实现,则它可能是合适的。 即便如此,您可能希望LINQ到数据库端的存储过程。

如果您从一开始就选择了LINQ,那么在确定列/视图/表权限和限制影响数据库实现细节的应用程序代码范围时,您显然已经做了一定的工作量。

这是什么意思? 这是否意味着您希望使用L2S来调用存储过程,或者是否要将存储过程中的所有T-SQL语句转换为L2S? 如果是后者,那么这样做不应该有太多问题。 大多数T-SQL语句都可以在Linq中表示而没有问题。

我可能会建议您调查像Linqer这样的工具来帮助您进行T-SQL转换。 它会将大多数任何T-SQL语句转换为Linq。 它节省了我转换一些查询的相当多的时间。

如果您已经测试并使用过存储过程,为什么要进行转换呢? 那只是无缘无故地工作。

如果您从头开始创建新产品并且想知道是否使用存储过程,那将是一个完全不同的问题。

在T-SQL中有许多构造在LINQ to SQL中没有并行。 从流控制开始,能够返回多个行集,递归查询。

您需要根据具体情况对此进行处理。 记住SP在数据库上进行大量过滤工作时,大部分过滤可能最终都会在客户端上进行,因此需要将更多数据从服务器移动到客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM