我想将我的所有db存储过程转换为linq到sql表达式,这项工作是否有任何限制?你必须注意我的数据库中有一些复杂的查询。
答案 0 :(得分:6)
Linq to SQL不支持SQL Server的几个功能:
hierarchyid
; OUTPUT INTO
条款; MERGE
声明; SET ROWCOUNT
优化分页查询(ROW_NUMBER
效率不高); DENSE_RANK
和NTILE
; ROLLUP
,CUBE
,COMPUTE
等进行分析性查询STDEV
,VAR
等PIVOT
和UNPIVOT
查询; 使用其中的一些东西,你可以在技术上编写自己的扩展方法,解析表达式树并实际生成正确的SQL,但这不适用于上面的所有,甚至当它是一个可行的选项,通常只是更容易编写SQL并调用命令或存储过程。 DataContext
为您提供ExecuteCommand
,ExecuteQuery
和ExecuteMethodCall
方法的原因。
正如我过去所说,像Linq to SQL这样的ORM是很好的工具,但它们不是银子弹。我发现,对于规模较大,数据库较多的项目,L2S通常可以处理大约95%的任务,但对于其他5%,你需要编写UDF或存储过程,有时甚至完全绕过DataContext
(对象跟踪对服务器触发器不起作用)。
对于较小/较简单的项目,很可能可以在Linq to SQL中执行所有操作。你
答案 1 :(得分:4)
我发现在几乎所有使用L2S完成新项目的情况下,我都完全不需要存储过程。事实上,很多情况下我会被迫使用存储过程,例如多变量过滤器,我发现通过在LINQ中动态构建查询,我实际上在绝大多数情况下获得了更好的查询因为我不需要在查询中包含那些在存储过程中被翻译为“不关心”的部分。因此,从我的角度来看,是的 - 您应该能够将存储过的转换为LINQ。
一个更好的问题,想一想,应该你将存储过程转换为LINQ?我认为,答案取决于项目的状态,您对C#/ VB和LINQ vs SQL的相对专业知识,转换的大小等。在现有项目中,我只会努力改进代码库的可维护性或可扩展性,或者如果我进行了重大更改,新代码将受益。在后一种情况下,您可以选择以递增方式将代码移动到纯LINQ,同时触摸它以进行更改。您可以将存储过程与LINQ一起使用,因此您可能不需要更改它以使用LINQ。
答案 2 :(得分:2)
我不喜欢这种做法。这是一个重大的体系结构变化,因为您现在正在删除之前用于获得解耦优势的主要界面层。
使用存储过程,您已经选择了数据库公开的接口。现在,您需要在应用程序存储过程中为所有基础表/视图而不是EXECUTE授予用户SELECT权限,并且可能需要在表/视图的列级别限制列读取权限。现在,您需要在较低级别重新实现存储过程先前使用单个隐式EXECUTE权限实现的每个显式基础表/视图/列权限。
在数据库预期的服务可以通过适当的存储过程库存进行枚举之前,现在潜在的数据库操作仅限于公开的表/视图/列,这极大地增加了耦合并且可能难以估计范围变化用于数据库重构和功能实现。
除非存在难以创建/维护存储过程接口的特定情况,否则我认为整体更改基于SP的工作架构几乎没有什么好处。如果LINQ由于应用程序级数据耦合(例如将本机集合连接到数据库)而生成更好的实现,则它可能是合适的。即便如此,您可能希望LINQ到数据库端的存储过程。
如果您从一开始就选择了LINQ,那么在确定列/视图/表权限和限制影响数据库实现细节的应用程序代码范围时,您显然已经做了一定的工作。
答案 3 :(得分:1)
这是什么意思?这是否意味着您希望使用L2S来调用存储过程,或者是否要将存储过程中的所有T-SQL语句转换为L2S?如果是后者,那么这样做不应该有太多问题。大多数T-SQL语句都可以在Linq中表示而没有问题。
我可能会建议您调查像Linqer这样的工具来帮助您进行T-SQL转换。它会将大多数任何T-SQL语句转换为Linq。它节省了我转换一些查询的相当多的时间。
答案 4 :(得分:0)
如果您已经测试并使用过存储过程,为什么要进行转换呢?那只是无缘无故地工作。
如果您从头开始创建新产品并且想知道是否使用存储过程,那将是一个完全不同的问题。
答案 5 :(得分:0)
T-SQL中有许多构造在LINQ to SQL中没有并行。从流控制开始,能够返回多个行集,递归查询。
您需要根据具体情况对此进行处理。记住SP在数据库上进行大量过滤工作时,大部分过滤可能最终都会在客户端上进行,因此需要将更多数据从服务器移动到客户端。