2017-01-10 11 views
7

Eylemimde bir arama/filtre bölümü oluşturmak için PredicateBuilder kullanıyorum. İşte burada: bu hat altındaPredicateBuilder.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)); 
     } 
    } 

PredicateBuilder.True<TableName>(); ben squiggly

PredicateBuilder.True() kullanılmıyor söyleyen bir yeşil olsun. Bunun yerine PredicateBuilder.New kullanın.

Ama PredicateBuilder.New<T> denedim ve herhangi değerler, parametreler için bu kadar cty geliyor yoksa bile benim yüklem daima 1 değerini alır ve inumber boş. Bu bana boş bir tabloyu döndürür. return View(lstValues.ToPagedList(page ?? 1, 2)); ile else ifadesini girerek tüm kayıtları döndürmesi gerektiğinde.

PredicateBuilder.True<T>'u kullandığımda, tüm parametreler boş olduğunda tüm kayıtların döndürülmesini sağlarım.

Bunun hakkında bir fikriniz var mı? Herhangi bir yardım takdir edilir.

cevap

7

var predicate = PredicateBuilder.New<TableName>(); Bunun yerine ne istediğinizi dahil, yerine dışlamak için varsayılan davranışını değiştirmek için PredicateBuilder.New<TableName>(true); olduğunu Expression<Func<TableName, bool>> predicate = item => false;

eşdeğerdir.

+0

Ahh öyleydi! Neden tanımı göz alamadım ve aşırı yük parametresinin bool defaultExpression olduğunu görmüyorum .. ama teşekkür ederim. –

İlgili konular