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

时间:2010-11-08 11:39:43

标签: c# linq

我是LINQ的新人 我想查询描述列字符串的所有行(示例值“我今天感觉很幸运。”)包含/匹配List<string> lst中的任何项目。
列表项的示例包含{“lucky”,“bad”,“ok”} 我想通过只使用linq实现,但我混淆了以下方法正确吗?
谢谢。

选项1:
var item =
from a in datatbl.AsEnumerable()
from b in lst
where a.Field<string>("description").contains(b)
select a;

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

2 个答案:

答案 0 :(得分:5)

您的两个选项都应该有效(更改包含到包含)。但是如果你想要不区分大小写,你需要使用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 :(得分:0)

发现如果一行值为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();