首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

确定LINQ
EN

Stack Overflow用户
提问于 2011-02-23 18:15:53
回答 3查看 202关注 0票数 1

在开发应用程序时,我通常使用存储过程来包含CRUD逻辑,以提高性能和可维护性。但是,在对LINQ进行了实验之后,我想知道,使用编译的LINQ查询对存储过程是否有助于提高性能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-23 19:33:06

根据您对DevSlick和a1ex07的评论,您似乎对LINQ是什么有一个根本的误解。为了让LINQ查询允许链接,如

代码语言:javascript
运行
复制
var activePeople = peopleList.Where(o => o.Active).OrderBy(o => o.Ordering).Select(o => o.Name);

LINQ查询的执行必须是延后,直到枚举为止:

代码语言:javascript
运行
复制
foreach(var person in activePeople)
{
   //If this is LINQ-to-SQL, the query to peopleList has waited until now to request anything from the database
}

这意味着,在此之前,您的计算机也不会实际解释查询.Where(o => o.Active).OrderBy(o => o.Ordering).Select(o => o.Name)。如果您运行相同的查询100次,这意味着计算机必须重新解释该查询100次。对于LINQ,这意味着在每次将SQL发送到数据库之前,将查询转换到SQL 100次,即使每次SQL完全相同。

提前编译查询会导致它只生成一次SQL,并且每次调用查询时都使用该SQL。这与存储过程无关--您将以编译任何其他查询的方式编译一个从查询到存储的过程。问“哪种表现更好”是毫无意义的,因为它们并不是相互排斥的。

尽管编译查询听起来是件好事,但实际上解释LINQ查询(通常称为“计算表达式树”)比实际针对数据库执行SQL所花费的时间非常少,所以编译查询的好处很小。同时,编译查询的语法是凶残

代码语言:javascript
运行
复制
static readonly Func<AdventureWorksEntities, Decimal, IQueryable<SalesOrderHeader>> s_compiledQuery2 = 
    CompiledQuery.Compile<AdventureWorksEntities, Decimal, IQueryable<SalesOrderHeader>>(
        (ctx, total) => from order in ctx.SalesOrderHeaders
                        where order.TotalDue >= total
                        select order);

var orders = s_compiledQuery2.Invoke(context, totalDue);

因此,通常建议不要编译LINQ查询,因为代码噪声与效益的比率非常糟糕。

票数 1
EN

Stack Overflow用户

发布于 2011-02-23 18:20:49

LINQ to SQL不会提高您的性能,因为您将把每个CRUD操作作为一个字符串发送到线路上。

使用存储过程,性能仍然会更好,但是ORM(如Linq到SQL )通常会使开发时间更快。

票数 2
EN

Stack Overflow用户

发布于 2011-02-23 18:43:17

根据我的经验,我可以将绩效排序如下:

  1. 存储过程
  2. 本机查询(使用DBCommand)
  3. Linq到实体(已编译的查询,EF4)
  4. Linq to SQL (已编译)
  5. Linq到实体(未编译EF4)
  6. Linq到SQL
  7. ESQL 2,3,4可能会根据查询的性质更改它们的顺序,但一般来说,原始sql查询是执行fater的。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5095142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档