如果我通过 CompiledQuery.Compile 进行编译实体查询,然后添加另一个 .Where() 子句或 .OrderBy() 子句,这些附加子句会强制完全重新编译、部分重新编译还是不重新编译?
问问题
173 次
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 回答