我一直在谷歌搜索过去几个小时找到解决我的问题,但我很难过。 我想知道是否有人可以帮助我解决以下问题。
我有一个查询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后端。 任何建议都会非常感激。
亲切的问候 尼尔。
答案 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)) )