代码之家  ›  专栏  ›  技术社区  ›  Orion Adrian

对已编译查询应用附加子句是否会导致重新编译?

  •  1
  • Orion Adrian  · 技术社区  · 14 年前

    如果我有一个通过CompiledQuery.Compile的编译实体查询,然后附加另一个.Where()子句或.OrderBy()子句,这些加法子句是强制完全重新编译、部分重新编译还是不重新编译?

    3 回复  |  直到 14 年前
        1
  •  0
  •   Albin Sunnanbo    14 年前

    使用已编译的查询

    public static Func<DataClasses1DataContext, IQueryable<ErrorLog>>
        GetErrorLogs = CompiledQuery.Compile
        ((DataClasses1DataContext context) =>
            context.ErrorLogs.Where(el => el.UserName != "foo"));
    

    这样称呼:

    using (DataClasses1DataContext context = new DataClasses1DataContext())
    {
        context.Log = Console.Out;
        var res1 = GetErrorLogs(context).ToList();
        var res2 = GetErrorLogs(context).Where(el=>el.ErrorMessage.Contains("foo")).ToList();
    }
    

    SELECT [t0].[ErrorLogID], [t0].[ErrorTime], [t0].[UserName], [t0].[ErrorNumber], [t0].[ErrorSeverity], [t0].[ErrorState], [t0].[ErrorProcedure], [t0].[ErrorLine], [t0].[ErrorMessage]
    FROM [dbo].[ErrorLog] AS [t0]
    WHERE [t0].[UserName] <> @p0
    -- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [foo]
    -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
    
    SELECT [t0].[ErrorLogID], [t0].[ErrorTime], [t0].[UserName], [t0].[ErrorNumber], [t0].[ErrorSeverity], [t0].[ErrorState], [t0].[ErrorProcedure], [t0].[ErrorLine], [t0].[ErrorMessage]
    FROM [dbo].[ErrorLog] AS [t0]
    WHERE [t0].[UserName] <> @p0
    -- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [foo]
    -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
    

    唯一的结论是没有重新编译,但是 .Where(el=>el.ErrorMessage.Contains("foo"))

        2
  •  2
  •   Carvellis    14 年前

    所有添加的子句都会导致不同的查询,因此需要重新编译。如果要确保没有进行重新编译,请使用 .AsEnumerable() .ToList()

    this msdn article .

        3
  •  1
  •   Craig Stuntz    14 年前

    完全重新编译。

    推荐文章