PredicateBuilder.New 对比 PredicateBuilder.True

PredicateBuilder.New vs PredicateBuilder.True

我正在使用 PredicateBuilder 在我的操作中创建一个 search/filter 部分。这是:

    [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>();我得到一个绿色波浪形的说法

PredicateBuilder.True() is obsolete. Use PredicateBuilder.New instead.

但是我已经尝试过 PredicateBuilder.New<T> 并且我的谓词总是得到 1 的值,即使我没有任何参数值,所以 cty,并且inumber 为空。这 returns 我一个空的 table.. 当它应该通过输入带有 return View(lstValues.ToPagedList(page ?? 1, 2));.

else 语句返回所有记录时

当我使用 PredicateBuilder.True<T> 时,当所有参数都为空时,我会返回所有记录。

知道这是为什么吗?感谢您的帮助。

var predicate = PredicateBuilder.New<TableName>(); 等同于 Expression<Func<TableName, bool>> predicate = item => false;

您想要的是 PredicateBuilder.New<TableName>(true); 将默认行为更改为包含而不是排除。