Jointure в linq с регулярным выражением - PullRequest
1 голос
/ 29 мая 2010

Я на самом деле использую объединение в linqtosql (через dblinq).

Я пытаюсь включить регулярное выражение в часть соединения запроса linq.

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

Я согласен, что могу поставить проверку RegExp в части where запроса linq, но мне было интересно, возможно ли это в части соединения? Приведенный выше код требует структуру кода "i равно j".

Одна вещь, которую я думаю выполнить, - это переопределение Equals (), которое будет содержать материал RegEx.IsMatch () и поместить простое i, равное j, в часть соединения.

Есть предложения по моей проблеме?

Ответы [ 2 ]

5 голосов
/ 29 мая 2010

Это неуместно в предложении объединения, потому что объединения в LINQ: equijoins - они проверяют, равен ли какой-либо прогноз из одной последовательности прогнозному значению в другой последовательности. Это не то, что вы пытаетесь сделать здесь - вы просто тестируете условие , которое зависит от обоих значений вместе.

А, где здесь более подходит пункт:

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

Однако я только что видел, что это LINQ to SQL - я не знаю, можно ли вообще использовать регулярные выражения в LINQ to SQL.

1 голос
/ 29 мая 2010
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 не является.


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

...