2010-07-15 4 views

답변

0

:

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"))은 LINQ2SQL 쿼리와 관련된 개체에 LINQ2Object와 함께 적용됩니다. .

+0

테스트를 어떻게 수행했는지 모르겠지만 컴파일 된 쿼리가 컴파일 된 후 다시 컴파일하면 결과가 다시 컴파일됩니다. – Carvellis

1

전체를 다시 컴파일하십시오.

+0

출처가 있으십니까? –

+1

그래도, 실제로 대답을 신뢰하지 않는다면 왜 물어 보는거야? 나는 어느 정도의 회의론을 이해할 수있다. 그러나 그 대답은 냉소적 인 사용자가 단지 그것을 찾아 낼 수도 있다는 것을 쉽게 발견 할 수있다. 나는 여기서 개인적인 사서가 아닌 경험 많은 개발자로서 질문에 답한다. –

+0

불행히도이 질문 클래스에서는 소싱없이 답이 정확한지 판단하기가 어렵습니다. 개인적으로 나는 Google에서 답을 찾기 위해 몇 시간을 보냈지 만 Google-fu는 아마도 당신보다 훨씬 약할 것입니다. 그러나 누군가 다른 사람이 와서 소싱하지 않고 다른 대답을했다면 어떻게 올바른 것을 결정할 수 있습니까? 나에게 이런 유형의 질문은 검증 가능한 프로그램이나 출처를 밝힌 답의 형태로 그 답을 제공하는 정답을 찾은 사람들에게 달려있다. 그게 너 한테 화가 나면 사과한다. –

2

모든 추가 절이 다른 쿼리를 생성하므로 다시 컴파일됩니다. 재 컴파일을 수행하지 않으려면 .AsEnumerable() 또는 .ToList()과 함께 쿼리 호출을 완료하십시오. 이것은 질의를 구체화하고 그 후에 당신이 원하는 모든 주문 등을 할 수 있습니다.

귀하의 요청에 따라 this msdn article을 참조하십시오. 이 같은라는 컴파일 된 쿼리

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