问题描述
首先,我按一些值搜索列,例如FX1624。此值转到TextBox,然后单击“搜索”。我的表格已被该值过滤,可以。 之后,我从文本框中删除此值,然后单击“搜索”以按空值搜索。而且它不起作用,不会返回任何空值。如何在此列中按空/空值过滤?
控制器:
public ActionResult XYZ(string account)
{
var docsModel = _docs.GetAll();
var model = docsModel
.Where(w => account == null || w.docsModel.ACCOUNT_NR == account)
.Select(s => new DocumentsModel
{
Comp_name = s.docsModel.NAME,Decision_choice = s.docsModel.DECISION,})
.OrderBy(o => o.docsModel.DATE);
return View(model);
}
查看:
@using (Html.BeginForm("XYZ","Home",FormMethod.Get))
{
<th>
AccountName: @Html.TextBox("account")
<input type="submit" value="Search" />
</th>
}
解决方法
您正在搜索模型
.Where(w => account == null || w.docsModel.ACCOUNT_NR == account)
但是您要传递的是一个空字符串,而不是null。
.Where(w => String.IsNullOrEmpty(account) || w.docsModel.ACCOUNT_NR == account)
以上内容应涵盖
,关于我的评论,如果您按照建议的答案进行操作,则在null时将对所有条目进行迭代,只是在整体迭代时返回全部,这是一件相当“昂贵”的事情,只需返回全部即可。
public ActionResult XYZ(string account)
{
var data= string.IsNullOrEmpty(account)
?_docs.GetAll()
:_docs.GetAll().Where(w => w.docsModel.ACCOUNT_NR.Equals(account,StringComparison.Ordinal);
var model = data.Select(s => new DocumentsModel{
Comp_name = s.docsModel.NAME,Decision_choice = s.docsModel.DECISION,})
.OrderBy(o => o.docsModel.DATE);
return View(model);
}
我认为您应该考虑更改_docs.GetAll()方法,以免在读取之后不读取内存中的所有条目,然后对其进行过滤,锁定和较大的数据集可能会导致问题。
要使用您在评论中添加的示例来回答您的问题
string[] inputs = { account,invoice,name };
var filteredData = inputs.All(x => string.IsNullOrWhiteSpace(x))
? _docs.GetAll()
: _docs.GetAll().Where(w => w.ACCOUNT.Equals(account,StringComparison.Ordinal)
|| w.INVOICE_NR.Equals(invoice,StringComparison.Ordinal)
|| w.NAME.Equals(name,StringComparison.Ordinal));
还有一个包含所有数据的IActionResult,您是否缺少分页?