用空字符串搜索列不起作用

时间:2020-10-29 09:25:38

标签: c# asp.net-mvc

首先,我按一些值搜索列,例如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>
        }

2 个答案:

答案 0 :(得分:1)

您正在搜索模型

.Where(w => account == null || w.docsModel.ACCOUNT_NR == account)

但是您要传递的是一个空字符串,而不是null。

.Where(w => String.IsNullOrEmpty(account) || w.docsModel.ACCOUNT_NR == account)

以上内容应涵盖

答案 1 :(得分:1)

关于我的评论,如果您按照建议的答案进行操作,则在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,您是否缺少分页?