首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linq到SQL到Linq的编译性能

Linq到SQL到Linq的编译性能
EN

Stack Overflow用户
提问于 2012-08-30 00:57:34
回答 3查看 1.5K关注 0票数 2
代码语言:javascript
运行
复制
string id = (from c in context.Users
             where c.u_id == Id
             select c.u_id).SingleOrDefault();

1)我如何使用Linq编译的查询来提高上面的性能。我们被限制只能使用.NET 3.5。

2)对于上述代码,使用编译后的linq查询在百分比方面会有什么性能提升?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-30 01:06:27

您可以通过以下方式创建编译后的查询:

代码语言:javascript
运行
复制
Func<YourContextType, int, string> query = CompiledQuery.Compile(
       (YourContextType context, int id) => 
           context.Users.Where(u => u.u_id == id).Select(u => u.u_id)
                  .SingleOrDefault()
       );

然后,您可以将其用作:

代码语言:javascript
运行
复制
string resultId = query(context, Id);

至于性能提升,这可能很重要,但也可能微乎其微。这实际上取决于执行查询的速度,以及重用编译后的查询的频率。在许多情况下,使用cmopiled查询实际上会更慢,因为编译的开销并不能弥补速度的提高。您需要进行测量,以确定这是否值得付出努力。

请注意,如果您知道自己只有一个惟一的ID,那么只需使用FirstOrDefault()而不是SingleOrDefault(),也可以提高原始查询的速度。

票数 3
EN

Stack Overflow用户

发布于 2012-08-30 01:05:52

像这样声明编译后的查询:

代码语言:javascript
运行
复制
static readonly Func<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE> compiledQuery  =
CompiledQuery.Compile<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE>(
(ctx, Id) => (from c in ctx.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();

然后在您的代码中调用已编译的查询:

代码语言:javascript
运行
复制
RETURN_VALUE_TYPE results = compiledQuery.Invoke(context, Id);

至于性能的提高,这可能取决于几个因素,但是请记住,在LINQ查询执行的范围内,查询编译是该过程中代价高昂的一部分。无论何时将LINQ查询逻辑添加到基于LINQ to SQL或Entity Framework的应用程序中,都应该考虑预编译查询并重用它们。

票数 1
EN

Stack Overflow用户

发布于 2012-08-30 01:20:25

一个厚颜无耻的选择是:不要让LINQ参与这样一个琐碎但对性能至关重要的操作。例如,使用dapper-dot-net:

代码语言:javascript
运行
复制
string id = connection.Query<string>(
    @"select u_id from Users where u_id = @id",
    new { id = Id }).SingleOrDefault();

这完全避免了所有的LINQ抽象,直接依赖于数据库(完全无参数等)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12182926

复制
相关文章

相似问题

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