我正在使用LinqToSql类和存储过程来检索数据。
我想知道 - 对于使用这种结构的性能来说太糟糕了,例如
datacontext.SelectUsers().Where(s=>s.userName = varUserName && s.pass = varUserPass);
OR
最好创建新程序,例如
select *
from Users
where name = @name and pass = @pass
答案 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'
或类似的:)