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

mas*_*ani 3 c# linq sql-server linq-to-sql

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

Aar*_*ght 6

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

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

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

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

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