2
string id = (from c in context.Users
             where c.u_id == Id
             select c.u_id).SingleOrDefault();

1)How i can improve the performance for the above using Linq complied query for the above. We are limited to use .NET 3.5 only.

2)What will be performance gain using a complied linq query for the above code in terms of percentage?

4

3 回答 3

3

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

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()
       );

然后,您将其用作:

string resultId = query(context, Id);

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

FirstOrDefault()请注意,如果您知道您只有一个唯一 ID,您还可以仅通过使用而不是来加速原始查询SingleOrDefault()

于 2012-08-29T17:06:26.580 回答
1

一个厚颜无耻的选择是:不要将 LINQ 用于这种微不足道但对性能至关重要的操作。例如,使用 dapper-dot-net:

string id = connection.Query<string>(
    @"select u_id from Users where u_id = @id",
    new { id = Id }).SingleOrDefault();

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

于 2012-08-29T17:20:24.583 回答
1

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

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();

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

RETURN_VALUE_TYPE results = compiledQuery.Invoke(context, Id);

关于性能改进可能取决于几件事,但是请记住,在 LINQ 查询执行范围内,查询编译是该过程中昂贵的部分。任何时候将 LINQ 查询逻辑添加到基于 LINQ to SQL 或 Entity Framework 的应用程序中,都应该考虑预编译查询并重用它们。

于 2012-08-29T17:05:51.950 回答