在成为许多(多年)的ADO.NET弟子之后,我终于想弄明白Linq了。在Linq中,从SQL Server函数返回的表数据类型为IQueryable,而从存储过程返回的数据是ISingleResult。
由于IQueryable更容易处理,我想使用它。我的问题:是一个SQL函数,它返回与同等存储过程一样有效的表数据吗?
答案 0 :(得分:2)
My question: is an SQL function that returns table data as efficient as an equivalent stored procedure?
是的,底层代码将在TSQL中以相同的方式通过查询优化器,因此对于“效率等效”,它必须是一个坚实的肯定。但是,有些东西在表值函数的帮助下,特别是如果函数可以内联(外部过滤器被带入函数内的查询)。
生成结果集(或多个)的SP只能从参数中获取输入,而内联表函数可以从外部查询中引入其他过滤器。考虑一下:
create function dbo.testif() returns table as return
select * from information_schema.columns
和查询
select * from dbo.testif() where TABLE_NAME like 'S%'
条件 TABLE_NAME就像'S%'实际上被带入函数内部的查询中,而您无法使用存储过程。
答案 1 :(得分:1)
LINQ-to-SQL对于简单查询非常有效,但在执行更复杂的语句时,您可以创建一个编译查询以便重用并提高性能。
查看System.Data.Linq.CompiledQuery
课程。
以下链接有一些性能测试和进一步讨论: http://www.codeproject.com/KB/linq/LINQquery.aspx
答案 2 :(得分:1)
Cyberwiki和Kirk的回答都帮助了我,但在Linq中使用存储过程似乎非常尴尬。我确实发现Linq会像表一样处理视图,所以我可以使用视图来塑造我的结果,所以我仍然可以在服务器上进行大部分处理,而不是在应用程序代码中加入表。
我认为使用视图以及Linq编译的查询以获得更好的性能(正如Kirk建议的那样),会给我想要的结果。