1

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

4

3 回答 3

2

所有添加的子句都会导致不同的查询,因此会重新编译。如果您想确保您没有进行重新编译,请使用.AsEnumerable()or完成对查询的调用.ToList()。这实现了查询,之后您可以进行所有您想要的排序等。

根据您的要求,请参阅此 msdn 文章

于 2010-07-15T22:38:44.167 回答
1

完全重新编译。

于 2010-07-15T20:27:52.747 回答
0

使用已编译的查询

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"))LINQ2Objects 应用于 LINQ2SQL 查询产生的对象。

于 2010-09-30T12:30:40.643 回答