【问题标题】:Linq to SQL to Linq compiled performanceLinq to SQL to Linq 编译性能
【发布时间】:2012-08-29 16:57:34
【问题描述】:
string id = (from c in context.Users
             where c.u_id == Id
             select c.u_id).SingleOrDefault();

1) 我如何使用 Linq 对上述内容进行编译查询来提高上述内容的性能。 我们仅限于使用 .NET 3.5。

2) 就百分比而言,对上述代码使用已编译的 linq 查询将获得什么性能提升?

【问题讨论】:

    标签: c# performance linq


    【解决方案1】:

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

    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 查询实际上更慢,因为编译的开销并不能弥补速度的提升。您需要进行衡量以确定这是否值得。

    请注意,如果您知道自己只有一个唯一 ID,则还可以通过使用 FirstOrDefault() 而不是 SingleOrDefault() 来潜在地加快原始查询。

    【讨论】:

    • 不要忘记,如果你在 web 上下文中使用 static 这样查询将编译一次而不是每个请求
    【解决方案2】:

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

    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 的应用程序中时,您都应该考虑预编译查询并重用它们。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        相关资源
        最近更新 更多