查询数据表字段包含列表中任意项的行<string>

Posted

技术标签:

【中文标题】查询数据表字段包含列表中任意项的行<string>【英文标题】:Query rows that the datatable field contain any item in the list<string> 【发布时间】:2011-05-06 15:01:04 【问题描述】:

我是 LINQ 的新手。 我想查询描述列字符串(示例值“我今天感觉很幸运。”)包含/匹配 List&lt;string&gt; lst 中的任何项目的所有行。 示例列表项包含 "lucky", "bad", "ok" 。 我想只使用 linq 来实现,但我很困惑以下方法是否正确?? 谢谢。

选项 1:var item =from a in datatbl.AsEnumerable()from b in lstwhere a.Field&lt;string&gt;("description").contains(b)select a;

选项 2:var item =from a in datatbl.AsEnumerable()where lst.Any(x=&gt; a.Field&lt;string&gt;("description").Contains(x))select a;

【问题讨论】:

【参考方案1】:

您的两个选项都应该有效(将包含更改为包含)。但是,如果您想不区分大小写,则需要使用 ToUpper 之类的。

例如,此代码提供“测试夹具”并处理不区分大小写。

        DataTable datatbl = new DataTable();
        datatbl.Columns.Add(new DataColumn("description",typeof(string)));
        // add simple test rows
        datatbl.Rows.Add("I'm feeling lucky today.");
        datatbl.Rows.Add("I'm feeling bad today.");
        datatbl.Rows.Add("I'm feeling good today.");
        // more test rows here...
        List<string> lst = new List<string>(new string[]  "Lucky", "bad", "ok" );

        var item =
            from a in datatbl.AsEnumerable()
            from b in lst
            where a.Field<string>("description").ToUpper().Contains(b.ToUpper())
            select a;

        var item2 =
            from a in datatbl.AsEnumerable()
            where lst.Any(x => a.Field<string>("description").ToUpper().Contains(x.ToUpper()))
            select a;

【讨论】:

+1 - 我意识到我误读了这个问题:) 除了您的解决方案之外,您还可以使用以下 where 子句,无需执行字符串的大写转换: where string.Compare(a.Field&lt;string&gt;("description"), b, StringComparison.OrdinalIgnoreCase) == 0 Les,Fredrik,感谢您的回复。它非常有用,这就是我想要的。 ;) 当我回到我的工作站时,我会试一试。【参考方案2】:

发现如果一行值是I'm not feeling Lucky, bad or ok today.,下面是Linq:

List<string> lst = new List<string>(new string[]  "Lucky", "bad", "ok" );
var item =  from a in datatbl.AsEnumerable()
            from b in lst
            where a.Field<string>("description").ToUpper().Contains(b.ToUpper())
            select a;

结果将返回我同一行的 3 个重复记录,默认情况下似乎并不明显。这是上面linq的情况吗?

要获得不同的行,我需要修改为:

List<string> lst = new List<string>(new string[]  "Lucky", "bad", "ok" );
var item =  (from a in datatbl.AsEnumerable()
            from b in lst
            where a.Field<string>("description").ToUpper().Contains(b.ToUpper())
            select a).Distinct();

【讨论】:

以上是关于查询数据表字段包含列表中任意项的行<string>的主要内容,如果未能解决你的问题,请参考以下文章

Mysql——通配符和正则表达式的使用

SQL JOIN 查询返回我们在连接表中没有找到匹配项的行

角度多行列表单击任意位置进行导航

有没有办法在 Google AppEngine Search API 中查询字段至少包含一个搜索项的文档?

获取列表中的最后一个重复元素

TSQL - 选择包含列表中所有项目的行