【问题标题】:Search datatable using Linq to dataset使用 Linq 搜索数据表到数据集
【发布时间】:2014-12-17 17:09:59
【问题描述】:

我有一个用户信息数据表。我正在尝试执行可以使用姓氏、用户 ID 或用户角色的搜索。我有一个用于名称和 ID 的搜索文本框以及一个用于用户角色的搜索下拉列表。并非所有内容都可以为空,但可以使用任何组合。我正在使用以下内容,但不认为这是正确的,因为它总是返回整个数据表:

dtUsers.CaseSensitive = false;
var results = dtUsers.AsEnumerable()
    .Where(r => r.Field<String>("LASTNAME").Contains(tbName.Text.Trim())
           ||   r.Field<String>("USERID").Contains(tbUserID.Text.Trim())
           ||   r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text));            

dtUsers = results.CopyToDataTable();

我做错了什么? 我还需要能够对姓名和 ID 进行部分搜索。

【问题讨论】:

    标签: c# asp.net linq datatable


    【解决方案1】:

    修改你的条件以首先检查空字符串(使用String.IsNullOrWhiteSpace 然后应用您的过滤器,例如:

    var results = dtUsers.AsEnumerable()
        .Where(r =>(!String.IsNullOrWhiteSpace(tbName.Text) && r.Field<String>("LASTNAME").Contains(tbName.Text.Trim())
               || (!String.IsNullOrWhiteSpace(tbUserID.Text) &&r.Field<String>("USERID").Contains(tbUserID.Text.Trim())
               || r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text));
    

    同样,您也可以使用最后一个条件来执行此操作,例如:

    (ddlRoles.SelectedItem != null && 
     !String.IsNullOrWhiteSpace(ddlRoles.SelectedItem.Text) && 
      r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text)
    

    【讨论】:

    • 谢谢哈比布,工作。它期望完全匹配,所以我将 .Contains(...) 更改为 .IndexOf(...) 并且我可以搜索部分名称或 ID。但是,即使我指定了 dtUser.CaseSensitive=false,它也希望大小写完全匹配。如果我输入“smi”,它不会返回用户“Smith”,但“Smi”会。
    • 对于不区分大小写的包含,使用IndexOf(tbName.Text, StringComparison.InvariantCultureIgnoreCast) &gt; -1) 请参阅:stackoverflow.com/questions/444798/…
    • @NoBullMan,就CaseSenstive属性而言,当你DataTable.Select(CaseSensitive property affects string comparisons in sorting, searching, and filtering)时会使用它,它不会影响任何基于LINQ的查询
    • 还有一个问题:用户可以拥有多个角色,例如“用户、帮助台”。还有一个名为 NonRegisteredUser 的角色。如果我从下拉列表中选择角色“用户”,它也会列出 NonRegisteredUsers,因为那里有“用户”一词。有什么办法可以防止这种情况?我总是可以将角色名称更改为 NonRegistered 但不是真正的解决方案。
    • 代替Contains使用Equalsit还有一个重载来指定不区分大小写的比较。
    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多