IQueryable
에 C# 확장 방법이 있습니다. FindNewCustomers()
및 FindCustomersRegisteredAfter(int year)
등 내가 LINQ to SQL에 대해 쿼리를 함께 "연결"하는 데 사용합니다. LINQ-to-SQL 컴파일 된 쿼리 문제 (컴파일되지 않은 쿼리로 작동)
private static Func<MyDataContext, SearchInfo, IQueryable<Customer>>
CQFindAll =
CompiledQuery.Compile((MyDataContext dc, SearchInfo info) =>
dc.Contacts.Select(c => c).FindCustomersRegisteredAfter(info.RegYear)
.OrderBy(info.OrderInfo)
.Skip(info.SkipCount)
.Take(info.PageSize));
FindCustomersRegisteredAfter(int year)
방법은 확장 방법은 IQueryable
을 복용 및이를 반환 : 컴파일 된 쿼리를 만들 예컨대을합니다. OrderBy
메서드는 문자열 (예 : "FirstName ASC"가 FirstName 오름차순 필드를 정렬 함)을 기반으로 동적 표현식을 만드는 확장 메서드 (System.Linq.Dynamic)입니다. Skip
및 Take
은 기본 제공 방법입니다.
이상 (컴파일 된 쿼리는 아니지만 일반 쿼리)은 으로 작동합니다. 쿼리가, 그냥 일반 LINQ 쿼리를 비 컴파일 된 경우
Method 'System.Linq.IQueryable`1[Domain.Customer] FindCustomersRegisteredAfter[Customer](System.Linq.IQueryable`1[Domain.Customer], Int32)' has no supported translation to SQL.다시 한번, 이 완벽하게 작동 : 내가 컴파일 된 쿼리에 넣어되면, 나는 다음과 같은 오류를했다. 이 오류는 CompiledQuery.Compile() 내에있는 경우에만 나타납니다.
도움말 ??
편집 :
SELECT [t1].[Id], [t1].[FirstName], [t1].[LastName],
[t1].[RegYear], [t1].[DeletedOn]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[LastName]) AS [ROW_NUMBER],
[t0].[Id], [t0].[FirstName], [t0].[LastName], [t0].[RegYear],
[t0].[DeletedOn]
FROM [dbo].[Contacts] AS [t0]
WHERE ([t0].[RegYear] > @p0) AND ([t0].[DeletedOn] IS NULL)
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2
ORDER BY [t1].[ROW_NUMBER]
그래서 당신이 볼 : 내가 var에 쿼리를 통해 쿼리 = (...) CompiledQuery.Compile의 내부와 같은 방법으로 작성하는 경우, 이것은 SQL이 생성된다 SQL은 완벽하게 번역이 가능하므로 반복적으로 작업하기 위해 @ p0, @ p1 및 @ p2 만 입력하면됩니다! CompiledQuery.Compile의 문제점은 무엇입니까?!?
업데이트 : @B 매개 변수가 아니기 때문에 OrderBy가 작동하지 않는다는 것을 알고 있습니다. 나는 아직도 CompiledQuery.Compile이 내 확장 메소드와 함께 작동하지 않는 이유를 알아 내려고하고있다. 이 주제에 대한 인터넷 정보는 거의 존재하지 않습니다.
왜 이것이 커뮤니티 위키인지 이해할 수 없습니다. – JustLoren