Tôi có phương pháp mở rộng C# trên IQueryable
, ví dụ: FindNewCustomers()
và FindCustomersRegisteredAfter(int year)
và vv mà tôi sử dụng để "chuỗi" một truy vấn với nhau cho LINQ to SQL.Vấn đề truy vấn được biên dịch từ LINQ to SQL (hoạt động như truy vấn chưa được biên dịch)
Bây giờ đến vấn đề của tôi: Tôi muốn tạo ra các truy vấn biên soạn, ví dụ .:
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));
Phương pháp FindCustomersRegisteredAfter(int year)
là một phương pháp khuyến nông tham gia một IQueryable
và trở về như cũ. Phương thức OrderBy
cũng là một phương thức mở rộng (System.Linq.Dynamic), tạo ra một biểu thức động dựa trên một chuỗi (ví dụ: "FirstName ASC" sẽ sắp xếp trường FirstName tăng dần). Skip
và Take
là các phương pháp tích hợp sẵn.
Truy vấn trên (không phải là được biên dịch, nhưng truy vấn thông thường) hoạt động hoàn hảo. Khi tôi đặt nó trong một truy vấn biên soạn, tôi nhấn các lỗi sau:
Method 'System.Linq.IQueryable`1[Domain.Customer] FindCustomersRegisteredAfter[Customer](System.Linq.IQueryable`1[Domain.Customer], Int32)' has no supported translation to SQL.
Một lần nữa, này hoạt động hoàn hảo nếu truy vấn là không biên soạn, chỉ cần một truy vấn LINQ thường xuyên. Lỗi này chỉ xuất hiện khi nó nằm bên trong CompiledQuery.Compile().
Help ??!
Edit: Nếu tôi tạo ra các truy vấn qua var query = (...) theo cùng một cách như bên trong CompiledQuery.Compile, đây là SQL tạo:
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]
Vì vậy, bạn thấy rằng SQL hoàn toàn có thể dịch được nên tôi chỉ cần điền vào @ p0, @ p1 và @ p2 để làm việc này lặp đi lặp lại! Có gì sai với CompiledQuery.Compile?!?
Cập nhật: Tôi hiểu rằng OrderBy không thể hoạt động (vì đây không phải là tham số @p). Tôi vẫn đang cố gắng tìm ra lý do tại sao CompiledQuery.Compile sẽ không hoạt động với các phương thức mở rộng của tôi. Thông tin trên internet cho chủ đề này hầu như không tồn tại.
Tôi không hiểu tại sao đây là wiki cộng đồng. – JustLoren