2017-01-10 11 views
7

Tôi đang sử dụng PredicateBuilder để tạo phần tìm kiếm/bộ lọc trong hành động của mình. Ở đây là:PredicateBuilder.New vs PredicateBuilder.True

[HttpPost] 
    public ActionResult Test(int? cty, string inumber, int? page) 
    { 

     var lstValues = 
      db.TableName.Include(x => x.Table1) 
       .Include(x => x.Table2) 
       .Include(x => x.Table3) 
       .ToList(); 

     var predicate = PredicateBuilder.True<TableName>(); 

     if (!string.IsNullOrWhiteSpace(inumber)) 
     { 
      predicate = predicate.And(x => x.Inumber == inumber); 
     } 

     if (!string.IsNullOrWhiteSpace(cty.ToString())) 
     { 
      predicate = predicate.And(x => x.CtyID == cty); 
     } 

     if (predicate.Parameters.Count > 0) 
     { 
      lstValues = db.TableName.AsExpandable().Where(predicate).ToList(); 
      Session["Paging"] = lstValues; 
      ViewBag.Paging = lstValues.ToPagedList(page ?? 1, 2); 
      return View(lstValues.ToPagedList(page ?? 1, 2)); 
     } 
     else 
     { 
      return View(lstValues.ToPagedList(page ?? 1, 2)); 
     } 
    } 

Dưới dòng này PredicateBuilder.True<TableName>(); tôi nhận được một màu xanh lá cây nguệch ngoạc nói

PredicateBuilder.True() là lỗi thời. Sử dụng PredicateBuilder.New thay thế.

Nhưng tôi đã cố gắng PredicateBuilder.New<T> và vị ngữ của tôi luôn luôn nhận được một giá trị của 1 ngay cả khi tôi không có bất kỳ giá trị sắp tới trong các thông số, vì vậy cty, và inumber là null. Điều này trả về cho tôi một bảng trống .. khi nó phải trả về tất cả các bản ghi bằng cách nhập câu lệnh else với return View(lstValues.ToPagedList(page ?? 1, 2));.

Khi tôi sử dụng PredicateBuilder.True<T> Tôi nhận được tất cả hồ sơ được trả về khi tất cả các tham số đều rỗng.

Bất kỳ ý tưởng nào về lý do đó là gì? Bất kỳ trợ giúp được đánh giá cao.

Trả lời

7

var predicate = PredicateBuilder.New<TableName>(); tương đương với Expression<Func<TableName, bool>> predicate = item => false;

gì bạn muốn thay vào đó là PredicateBuilder.New<TableName>(true); để thay đổi hành vi mặc định để bao gồm, chứ không phải là loại trừ.

+0

Ahh! Tôi không biết tại sao tôi không nhìn trộm định nghĩa và thấy rằng tham số cho quá tải là 'bool defaultExpression' .. nhưng cảm ơn bạn. –

Các vấn đề liên quan