Trước tiên, tôi phải nói rằng tôi đã đọc một số bài về điều này tại StackOverflow nhưng tôi không thể có được kết quả mong muốn.LINQ to SQL kết hợp hai biểu thức <Func <T, bool>> ("where khoản") với và/hoặc
Hãy để tôi giải thích ngữ cảnh (đơn giản): Tôi đang sử dụng LINQ to SQL để truy vấn khách hàng với các lần truy cập gần đây đến cửa hàng và (tùy chọn) chỉ nhận những người có số tiền thanh toán nhất định. Giả sử tôi có một mô hình với khách hàng, thăm và các lớp học thanh toán.
Vì vậy, tập trung vào sự biểu hiện Where
, tôi đang cố gắng này:
Expression<Func<Entityes.Clients, bool>> filter = null;
filter = c =>
c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince));
if (minPayment.HasValue && minPayment.Value > 0)
{
filter.And(
c => c.Payments.Sum(p => p.Quantity) > minPayment.Value);
}
Phương pháp filter.And
là một phương pháp khuyến nông, khuyến cáo tại diễn đàn này, bên dưới, bạn có thể xem định nghĩa:
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
Expression<Func<T, bool>> expression2)
{
InvocationExpression invokedExpression =
Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());
return Expression.Lambda<Func<T, bool>>
(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
Tuy nhiên, điều này không hiệu quả với tôi như mong đợi và kết quả không được lọc theo số tiền thanh toán. Không có lỗi với dữ liệu hoặc mô hình LINQ-to-sql vì mã này hoạt động tốt:
filter = c =>
c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince)))
&& c => c.Payments.Sum(p => p.Quantity) > minPayment.Value;
Tuy nhiên, tôi không muốn sử dụng mã cuối cùng bởi vì tôi có một số tình huống phức tạp hơn, trong đó tôi cần phải xây dựng biểu thức lọc theo từng bước với kết hợp 'và/hoặc' của mỗi phần.
PD: Tôi là một "ADO.Net DataSets" guy cố gắng tìm hiểu Linq-to-SQL và sớm Entity Framework, tôi hy vọng sẽ hữu ích cho cộng đồng StackOverflow sớm.
p.s., bạn nên sử dụng phương thức 'Expression.AndAlso()' để tạo biểu thức logic AND ('&&'). 'Expression.And()' tạo ra biểu thức bitwise AND ('&'). –