我使用PredicateBuilder在我的操作中创建一个搜索/筛选部分。下面是:
[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()已经过时。使用PredicateBuilder.New代替。
但是我尝试过PredicateBuilder.New<T>,我的谓词总是得到1的值,即使参数没有任何值,所以cty和inumber都是空的。这会给我一张空桌子。当它应该通过输入带有else语句的return View(lstValues.ToPagedList(page ?? 1, 2));返回所有记录时。
当我使用PredicateBuilder.True<T>时,当所有参数都为null时,我会得到返回的所有记录。
知道为什么会这样吗?任何帮助都是非常感谢的。
发布于 2017-01-10 21:13:38
var predicate = PredicateBuilder.New<TableName>();等价于Expression<Func<TableName, bool>> predicate = item => false;
相反,您想要的是PredicateBuilder.New<TableName>(true);将默认行为更改为包含,而不是排除。
https://stackoverflow.com/questions/41578273
复制相似问题