使用Linq检索数据哪种方式更好?

时间:2011-01-21 10:00:18

标签: .net visual-studio-2010 linq-to-sql

我正在使用LinqToSql类和存储过程来检索数据。

我想知道 - 对于使用这种结构的性能来说太糟糕了,例如

datacontext.SelectUsers().Where(s=>s.userName = varUserName && s.pass = varUserPass);

OR

最好创建新程序,例如

select *
from Users 
where name = @name and pass = @pass

4 个答案:

答案 0 :(得分:1)

存储过程通常会提供更好的性能,因为它将进行预编译。

但是在大​​多数情况下使用现代SQL服务器和Linq非常接近,因为linq库创建了可以编译和重用的sql语句。

对于更复杂的语句,linq可以多次创建一个更高效的查询,您可以手动执行,因此如果性能最重要,请测试两者并查看哪个最适合您的解决方案,也许使用linqpad中的链接生成sql,然后拿那个sql并构建一​​个存储过程:)

答案 1 :(得分:0)

很明显,sprocs会以这种方式或其他方式降低性能,因为linq最终会转换为sql查询,而且因为使用了sproc,你可以调整结果并设计你的查询,因此它应该减少重量

如果可读性对您来说很重要,我不确定您是否总是想要使用sprocs。

linq也不总是返回对象,sprocs。在linq中,您不需要包含sproc及其参数的硬编码部分,而在sprocs中可能需要。

因此,应根据查询的深度,可伸缩性(即查询结果的返回频率和数量)与可读性和代码的一致性来衡量这些因素。

答案 2 :(得分:0)

如果您使用Linq或存储过程,您将获得两个编译,问题是SelectUsers将返回多少条记录。如果它是一个昂贵的查询或返回大量数据,那么你最好创建一个新程序,因为性能可能更好,返回的数据量会更少。

但是,如果SelectUsers只返回少量数据,那么你的解决方案没有问题,除了你应该使用Single而不是Where,假设你只想要一个通过用户。

答案 3 :(得分:-1)

存储过程保存在服务器中并由应用程序调用,该语句不会离开服务器,只有语句名称和参数值被发送到SQL服务器,我认为这是一个很好的方法,因为如果你决定更改过程的逻辑之后,您不必重新构建和重新部署应用程序,但您只需更新存储过程。

在存储过程中使用所有逻辑还允许您按特定内容进行查询,以便您可以轻松地找到具有列名或某个注释的所有过程,这非常方便,并且比在Visual Studio中的所有文件中进行更好。例如,最近我经常使用这样的查询:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%ROLLBACK TRANSACTION%'
AND ROUTINE_TYPE='PROCEDURE'

或类似的:)