2010-07-15 32 views

回答

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 

的唯一结论是,没有重新编译,但将LINQ2Objects应用于由LINQ2SQL查询产生的对象上的.Where(el=>el.ErrorMessage.Contains("foo"))

+0

我不知道你是如何做你的测试的,但是在编译后的查询之后添加一个地方肯定会导致重新编译。 – Carvellis 2011-04-02 08:43:57

1

完全重新编译。

+0

你有来源吗? – 2010-07-15 20:50:21

+1

我这样做,但如果你实际上不相信你在这里得到的答案,为什么要问?我可以理解某种程度的怀疑态度,但答案很容易找到,愤世嫉俗的用户不妨去找到它。我在这里以有经验的开发人员的身份回答问题,而不是作为个人图书管理员。 – 2010-07-15 21:18:06

+0

不幸的是,在这类问题中,很难确定您的答案在没有采购的情况下是否正确。就我个人而言,我花了几个小时在Google上寻找答案,但也许我的Google-fu比你的弱得多。但是,如果有其他人出现并说出另一个答案,而没有采购,我将如何确定正确的答案?对我而言,这种类型的问题依赖于已经找到正确答案的人们以可验证程序或源代码答案的形式提供答案。如果你冒犯了我,我表示歉意。 – 2010-07-16 03:48:14

2

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

根据您的要求,请参阅this msdn article