CompiledQuery.Compile을 통해 컴파일 된 엔터티 쿼리를 가지고 다른 .Where() 절 또는 .OrderBy() 절을 추가하는 경우 이러한 추가 절을 전체 재 컴파일, 부분 재 컴파일 또는 재 컴파일을 강제 수행합니까?컴파일 된 쿼리에 추가 절을 적용하면 다시 컴파일됩니까?
답변
:
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와 함께 적용됩니다. .
전체를 다시 컴파일하십시오.
출처가 있으십니까? –
그래도, 실제로 대답을 신뢰하지 않는다면 왜 물어 보는거야? 나는 어느 정도의 회의론을 이해할 수있다. 그러나 그 대답은 냉소적 인 사용자가 단지 그것을 찾아 낼 수도 있다는 것을 쉽게 발견 할 수있다. 나는 여기서 개인적인 사서가 아닌 경험 많은 개발자로서 질문에 답한다. –
불행히도이 질문 클래스에서는 소싱없이 답이 정확한지 판단하기가 어렵습니다. 개인적으로 나는 Google에서 답을 찾기 위해 몇 시간을 보냈지 만 Google-fu는 아마도 당신보다 훨씬 약할 것입니다. 그러나 누군가 다른 사람이 와서 소싱하지 않고 다른 대답을했다면 어떻게 올바른 것을 결정할 수 있습니까? 나에게 이런 유형의 질문은 검증 가능한 프로그램이나 출처를 밝힌 답의 형태로 그 답을 제공하는 정답을 찾은 사람들에게 달려있다. 그게 너 한테 화가 나면 사과한다. –
모든 추가 절이 다른 쿼리를 생성하므로 다시 컴파일됩니다. 재 컴파일을 수행하지 않으려면 .AsEnumerable()
또는 .ToList()
과 함께 쿼리 호출을 완료하십시오. 이것은 질의를 구체화하고 그 후에 당신이 원하는 모든 주문 등을 할 수 있습니다.
귀하의 요청에 따라 this msdn article을 참조하십시오. 이 같은라는 컴파일 된 쿼리
public static Func<DataClasses1DataContext, IQueryable<ErrorLog>>
GetErrorLogs = CompiledQuery.Compile
((DataClasses1DataContext context) =>
context.ErrorLogs.Where(el => el.UserName != "foo"));
와
테스트를 어떻게 수행했는지 모르겠지만 컴파일 된 쿼리가 컴파일 된 후 다시 컴파일하면 결과가 다시 컴파일됩니다. – Carvellis