tôi cần phải lọc một danh sách các tài liệu bằng cách chuyển chúng vào một bộ lọc tùy chỉnh mà tôi đang đấu tranh để xây dựng động sử dụng một vòng lặp foreach
:Xây dựng một vị tùy chỉnh để hoạt động như một bộ lọc bằng cách sử dụng foreach vòng lặp
var mainPredicate = PredicateBuilder.True<Document>();
// mainPredicate is combined to other filters successfully here ...
var innerPredicate = PredicateBuilder.False<Document>();
foreach (var period in periods)
{
var p = period;
Expression<Func<Document, bool>> inPeriod =
d => d.Date >= p.DateFrom && d.Date <= p.DateTo;
innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));
}
mainPredicate = mainPredicate.And(innerPredicate);
dòng cuối cùng này:
documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();
Ném ngoại lệ này:
Tham số 'd' không bị ràng buộc trong biểu thức truy vấn LINQ to Entities được chỉ định.
Bất cứ ai cũng biết tại sao tôi bị ngoại lệ này? Tôi không hiểu nơi mà các 'd' tham số tôi đang đi đến phương pháp InPeriod bị mất. Tôi không biết những gì còn thiếu để làm việc này. Mã của tôi giống như nhiều ví dụ khác hoạt động hoàn hảo. Bất kỳ thông tin lý thuyết bổ sung lý thuyết nào về cách gọi các biểu thức và cách nó hoạt động phía sau hậu trường đều được chào đón.
Điều gì xảy ra nếu bạn thực hiện 'mainPredicate.Expand(). Biên dịch(). Gọi (someDocument)'? Bạn có chắc chắn vấn đề không phải ở một nơi nào khác (mã của bạn có vẻ ổn với tôi) không? – svick
Với gợi ý của bạn, tôi đã sửa đổi dòng cuối cùng để nó trông như sau: 'documentEntries = this.ObjectSet.AsExpandable(). Where (de => mainPredicate.Expand(). Compile(). Invoke (de)). ToList (); nhưng nó ném: LINQ to Entities không nhận ra phương thức 'Boolean Invoke (Remabec.PM.Tarification.DocumentEntry)' phương pháp, và phương pháp này không thể được dịch sang một biểu thức cửa hàng. –
Vâng, điều đó sẽ không hoạt động và đó không phải là ý tôi. Bạn có thể tự mình thực thi mã của tôi không? – svick