C# DataContext提供了ExecuteCommand、ExecuteQuery和ExecuteMethodCall方法

C# DataContext提供了ExecuteCommand、ExecuteQuery和ExecuteMethodCall方法,c#,sql-server,linq,linq-to-sql,C#,Sql Server,Linq,Linq To Sql,正如我在过去说过的,像Linq到SQL这样的ORM是很好的工具,但它们不是万能的。我发现,对于大型数据库密集型项目,L2通常可以处理大约95%的任务,但对于另外5%的任务,您需要编写UDF或存储过程,有时甚至需要完全绕过DataContext(对象跟踪不能很好地处理服务器触发器) 对于较小/更简单的项目,很可能您可以在LINQtoSQL中执行所有操作。你是否应该是一个完全不同的问题,我不打算在这里回答。@Christian-为什么要皈依他们?一个很好的理由。通过将查询转换为Linq查询,您可以获

正如我在过去说过的,像Linq到SQL这样的ORM是很好的工具,但它们不是万能的。我发现,对于大型数据库密集型项目,L2通常可以处理大约95%的任务,但对于另外5%的任务,您需要编写UDF或存储过程,有时甚至需要完全绕过
DataContext
(对象跟踪不能很好地处理服务器触发器)


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

@Christian-为什么要皈依他们?一个很好的理由。通过将查询转换为Linq查询,您可以获得在应用程序中使用强类型查询的好处。当您开始重构数据库时,这是非常强大的。然后,您可以让编译器告诉您哪些查询需要返工。+1:如果没有损坏,就不要修复它。(尽管在这种情况下,还不清楚它是否损坏,或者“损坏”的值是否足够损坏。)@Richard——没错,但“损坏”的定义比“不工作”的定义更多。转向“仅代码”解决方案可能会提高可维护性,减少技术债务,或者更好地适应可用的开发人员技能组合。从另一个角度来看,一个“有效”的解决方案仍然可能被打破。还有几个其他的原因可以让sprocs继续下去。在安全方面,您可以锁定对整个表的访问,并且只允许通过存储过程访问数据。使用LINQ,您将执行常规DML。此外,存储过程还具有在第一次调用后缓存其执行计划的好处。另外,根据您的体系结构,在存储过程中修复数据库查询通常比每次重新编译和发送新的二进制文件更容易。您知道这让我想起了什么吗?回到ASP的经典时代,我偶尔会看到人们决定通过根目录中的“index.ASP”运行所有内容,而只是使用一组查询字符串解析器来输出不同的内容。听起来不错-一个包含所有逻辑的文件,但实际上它是一个维护噩梦。LINQ to SQL的要点是,如果操作正确,工作仍然会在数据库中完成,因为LINQ接受您构建的表达式并将其转换为查询。情况并非总是如此,因为有些C#构造没有转换成SQL(至少,现在还没有),但在大多数情况下确实如此。@tvanfosson:更多的情况是许多T-SQL构造无法从LINQ访问。如果SP在很大程度上是围绕单个DML语句的包装,那么几乎可以肯定转换是可能的,但是如果使用更高级的T-SQL(例如递归查询),则在LINQ上是等效的。不知道更多关于SPs性质的信息)。如果有效的话,我会坚持不改变它的一般说法。是的,递归查询是坚持使用存储过程的一个很好的理由。+1我还将添加PIVOT查询,这在处理EAV表时经常使用。事实上,EAV注释还提醒了我XML列,这些列在L2S中也无法有效使用。尽管有些人可能会说,如果您使用的是EAV模型,那么您已经输掉了这场战斗p重要注意事项,但是,如果安全性是一个问题,您可以使用sps进行插入、更新、删除(通过SP方法使用LINQ到SQL非常简单),但仍然允许只读查询。(是的,有时甚至选择特权也太多了,YMMV。)