2010-07-15 62 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