OK, đây là giao dịch: dataContext.Table1s
thuộc loại IQueryable<T>
. IQueryable<T>
xác định các phương thức Where
và Any
có một biến vị ngữ loại Expression<Func<T, bool>>
. Các wrapper Expression<>
là rất quan trọng, vì đây là những gì cho phép LINQ to SQL dịch biểu thức lambda của bạn thành SQL và thực hiện nó trên máy chủ cơ sở dữ liệu.
Tuy nhiên, IQueryable<T>
cũng bao gồm IEnumerable<T>
. IEnumerable<T>
cũng định nghĩa các phương thức Where
và Any
, nhưng phiên bản IEnumerable có một biến vị ngữ loại Func<T, bool>
. Bởi vì đây là một hàm được biên dịch và không phải là một biểu thức, nó không thể được dịch sang SQL. Kết quả là, mã này ...
Func<Table1, bool> lambda = x => x.Id > 1000;
var result = dataContext.Table1s.Where(lambda);
... sẽ kéo MỌI bản ghi ra khỏi Table1s
vào bộ nhớ, sau đó lọc các bản ghi trong bộ nhớ. Nó hoạt động, nhưng nó thực sự là tin xấu nếu bảng của bạn lớn.
Func<Table1, bool> lambda = x => x.Id > 1000;
var result = dataContext.Table2s.Where(x => x.Table1s.Any(lambda));
Phiên bản này có hai biểu thức lambda. Bản thứ hai, được chuyển trực tiếp vào Where
, là Expression
bao gồm tham chiếu đến một số Func
. Bạn không thể kết hợp cả hai và thông báo lỗi bạn đang nhận được cho bạn biết rằng cuộc gọi đến Any
đang mong đợi một số Expression
nhưng bạn đang chuyển vào một số Func
.
var result = dataContext.Table2s.Where(x => x.Table1s.Any(y => y.Id > 1000));
Trong phiên bản này, lambda bên trong của bạn được tự động được chuyển đổi thành một Expression
vì đó là lựa chọn duy nhất nếu bạn muốn mã của bạn để được chuyển đổi thành SQL bởi LINQ to SQL. Trong các trường hợp khác, bạn buộc lambda phải là Func
thay vì Expression
- trong trường hợp này là không, vì vậy nó hoạt động.
Giải pháp là gì? Nó thực sự khá đơn giản:
Expression<Func<Table1, bool>> lambda = x => x.Id > 1000;
Hãy thử sử dụng 'var lamda = x => x.Id> 1000;'. Không biết điều đó sẽ hữu ích, nhưng có thể ... – Alxandr
@Alxandr - điều đó không thực sự hợp pháp. Các biểu thức lambda có thể được biên dịch thành 'Func <>' hoặc 'Expression>' và trong ví dụ của bạn trình biên dịch sẽ không thể biết bạn muốn cái nào và sẽ ném một lỗi. –