linq中的关节具有正则表达式

时间:2010-05-29 10:36:17

标签: c# regex linq join equals

我实际上在linqtosql中使用了一个连接(通过dblinq)。

我正在尝试在linq查询的连接部分中包含正则表达式。

from i in collectiona
join j in collectionb on Regex.IsMatch(i.name, j.jokered_name) equals true
(...)

我同意我可以在linq查询的where部分推送RegExp检查,但我想知道是否可以在连接部分?上面的代码需要一个“i equals j”代码结构。

我认为要执行的一件事是重写Equals(),它将包含RegEx.IsMatch()内容并在连接部分中放置一个简单的i等于j。

有关我的问题的任何建议吗?

2 个答案:

答案 0 :(得分:5)

在join子句中它是不合适的,因为LINQ中的连接是 equijoins - 它们检查来自一个序列的某些投影是否等于另一个序列中的投影值。这不是你要在这里做的 - 你只是测试一个条件,这取决于两个值。

这里的where子句更合适:

from i in collectiona
from j in collectionb
where Regex.IsMatch(i.name, j.jokered_name)
select ...

但是,我刚刚看到这是LINQ to SQL - 我不知道你是否可以在LINQ to SQL中使用正则表达式

答案 1 :(得分:1)

from i in collectiona 
join j in collectionb
on x equals y

此代码转换为对Enumerable.Join的调用:

collectiona.Join(
  collectionb,
  i => x,
  j => y,
  (i, j) => new {i, j}
)

从这里可以很容易地看出i在x表达式的范围内,而j则不在。{/ p>


from i in collectiona
from j in collectionb
where z

相当于:

collectiona
  .SelectMany(i => collectionb, (i, j) => new {i, j})
  .Where(q => z)

每个q都有一个i和一个j可供z表达式使用。