Tôi có một biểu mẫu có nhiều trường trên đó (tên công ty, mã bưu điện, v.v.) cho phép người dùng tìm kiếm các công ty trong cơ sở dữ liệu. Nếu người dùng nhập các giá trị vào nhiều trường thì tôi cần phải tìm kiếm trên tất cả các trường đó. Tôi đang sử dụng LINQ để truy vấn cơ sở dữ liệu.Làm cách nào để kết hợp các biểu thức LINQ thành một?
Cho đến nay tôi đã quản lý để viết một hàm sẽ xem xét đầu vào của chúng và biến nó thành Danh sách biểu thức. Bây giờ tôi muốn biến List đó thành một biểu thức duy nhất mà sau đó tôi có thể thực thi thông qua nhà cung cấp LINQ.
nỗ lực ban đầu của tôi là như sau
private Expression<Func<Company, bool>> Combine(IList<Expression<Func<Company, bool>>> expressions)
{
if (expressions.Count == 0)
{
return null;
}
if (expressions.Count == 1)
{
return expressions[0];
}
Expression<Func<Company, bool>> combined = expressions[0];
expressions.Skip(1).ToList().ForEach(expr => combined = Expression.And(combined, expr));
return combined;
}
Tuy nhiên điều này không thành công với một thông điệp ngoại lệ dọc theo dòng của "Nhà điều hành nhị phân Và không được định nghĩa cho ...". Có ai có bất kỳ ý tưởng những gì tôi cần phải làm để kết hợp các biểu thức?
CHỈNH SỬA: Sửa dòng mà tôi đã quên gán kết quả và sắp xếp các biểu thức với nhau thành một biến. Cảm ơn bạn đã chỉ ra rằng mọi người.
@Jon Skeet: 'combined' sẽ được nhập là 'Expression'; bạn cần thực hiện một số công việc để trả về nó như là một công thức 'Expression>'. –
jason
Tôi đồng ý rằng mã đầu tiên của bạn dễ hiểu hơn, vì vậy tôi sẽ đưa ra câu trả lời đúng. Tuy nhiên tôi thực sự sẽ sử dụng đoạn thứ hai vì đây là chính xác những gì tôi cần - Tôi đã làm mọi thứ quá phức tạp, cảm ơn Jon. – gilles27
Trớ trêu thay tôi đã chỉnh sửa trong khi cả hai nhận xét này đều được viết - nhưng vì đoạn trích thứ hai này đã được sử dụng, tôi nghĩ tôi sẽ để nó như cũ :) –