Tôi đang cố gắng để tạo ra một phương pháp lọc cho Entity Danh sách khuôn khổ và hiểu rõ hơn về Expression<Func<...
Entity Framework Lọc "Expression <Func <T, bool>>"
Tôi có một thử nghiệm chức năng như thế này.
public IQueryable<T> Filter<T>(IEnumerable<T> src, Expression<Func<T, bool>> pred)
{
return src.AsQueryable().Where(pred);
}
và nếu tôi làm điều này:
context.Table.Filter(e => e.ID < 500);
hay này:
context.Table.Filter(e => e.SubTable.Where(et => et.ID < 500).Count() > 0 && e.ID < 500);
nó tất cả hoạt động tốt.
Nhưng nếu tôi làm điều này:
context.Table.Filter(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
hay này:
context.Table.Where(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
tôi nhận được một lỗi. LINQ to Entities does not recognize the method ...Filter...
Tại sao nó hoạt động trong một trường hợp chứ không phải trong trình bổ sung? Tôi nên thay đổi gì trong Bộ lọc để nó hoạt động với các bảng có liên quan. Tôi thích tránh xa các thư viện bên ngoài khác như những gì tôi muốn là tìm hiểu cách hoạt động và có thể sử dụng nó trong bất kỳ kịch bản nào trong tương lai.
Trong hai trường hợp đầu tiên bộ lọc chạy trong cơ sở dữ liệu chính xác.
bởi rất nhiều đọc và dùng thử và lỗi tôi nghi ngờ đây là cách duy nhất. nó sẽ làm việc các trường hợp như context.Table.Where (e => e.subTable.Any (MyFilter())); –
@ Pedro.The.Kid: Không, nó sẽ không. Kết quả của phương thức này cần phải được chuyển tới ngoài cùng bên ngoài 'Where', bởi vì mọi biểu thức mà bạn truyền tới ngoài cùng bên ngoài' Where' không thực sự được thực hiện nhưng được diễn giải. –
Tôi đã thực hiện một thử nghiệm và điều này hoạt động var lọc = MyFilter(); context.Table.Where (e => e.subTable.AsQueryable() .bất kỳ (bộ lọc)); –