C#Linq where子句.Contains(string [])

时间:2011-03-25 14:33:43

标签: c# linq string ienumerable

我一直在谷歌搜索过去几个小时找到解决我的问题,但我很难过。 我想知道是否有人可以帮助我解决以下问题。

我有一个查询DataTable的Linq查询。我有一个字符串[] BodyTypes的参数,它包含“5,7,11”或“6,7,4”之类的字符串或只是“5”,

我拥有的Linq是:

 var query2 = (from v in query.AsEnumerable()
                              where  (from yy in BodyTypes       
                                      select yy).Contains(v.Header36.ToString())
                              select new
                              {
                                  PartNumber = v.PartNumber,
                                  Position = v.Position,
                                  ImagePath = v.ImagePath,
                                  Supplier = v.Supplier,
                                  Price = v.Price,
                                  RRP = v.RRP,
                                  Stock = v.Stock,
                                  BaseCat = v.BaseCat,
                                  Description = v.Description,
                                  Header36 = v.Header36,
                                  GT_Id = v.GT_Id
                              });

v.Header36每行分配不同的值,即“11,7,4,5”或“11,6,7”

我的问题是如何使用Linq进行匹配,我想将Header36与在字符串[] BodyTypes数组中传递的任何内容匹配,就像使用通配符或类似语句一样。 我的问题是这个DataTable是从第三方的webservice加载的,所以这里不能使用SQL后端。 任何建议都会非常感激。

亲切的问候 尼尔。

3 个答案:

答案 0 :(得分:1)

使LINQ to Objects实际上意味着它更容易回答。我想你想要的东西:

from v in query.AsEnumerable()
let headers = v.Header36.Split(',')
where yy.BodyTypes.Intersect(headers).Any()
select new [...]

请注意,您的(from yy in BodyTypes select yy) 大部分等同于BodyTypes(至少会以您使用它的方式提供) - 您不需要每次要做任何事情时都要使用查询表达式。

这是一个稍微高效的版本:

HashSet<String> bodyTypes = new HashSet<String>(yy.BodyTypes);
var query = from v in query.AsEnumerable()
            let headers =  v.Header36.Split(',')
            where bodyTypes.Overlaps(headers)
            select new [...]

答案 1 :(得分:0)

尝试使用正则表达式和.Any方法:

where  (from yy in BodyTypes  
        select yy).Any( y => (new Regex(v.Header36.ToString())).IsMatch(y))

答案 2 :(得分:0)

如果我理解了这一点,那么您的正文时间可能包含1,2,3,4而您的Header36可能包含2,5,并且您希望在两个分隔的字符串中出现项目时进行匹配?

更改你的where子句

where  (from yy in BodyTypes select yy)
    .Any(bts=> bts.Split(',').Any(bt=> v.Header36.Split(',').Contains(bt)) )