我实际上在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。
有关我的问题的任何建议吗?
答案 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表达式使用。