2010-05-29 11 views
1

J'utilise en fait une jointure dans linqtosql (via dblinq).Jointure dans linq avec une expression régulière

J'essaie d'inclure une expression régulière dans la partie jointe de la requête linq.

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

Je suis d'accord que je peux pousser la vérification RegExp dans la partie où de la requête LINQ, mais je me demandais s'il est possible dans la jointure partie? Le code ci-dessus veut une structure de code "i est égal à j". Une chose que je pense effectuer consiste à surcharger Equals() qui contient le contenu de RegEx.IsMatch() et mettre un simple i égal à j dans la partie jointe.

Des suggestions à propos de mon problème?

Répondre

5

Il est inapproprié dans la clause join car les jointures dans LINQ sont equijoins - elles vérifient si une projection d'une séquence est égale à une valeur projetée dans l'autre séquence. Ce n'est pas ce que vous essayez de faire ici - vous testez simplement une condition qui dépend des deux valeurs ensemble.

Une clause where est plus approprié ici:

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

Cependant, je viens juste de voir que cela est LINQ to SQL - Je ne sais pas si vous pouvez utiliser des expressions régulières tout en LINQ à SQL.

+1

Vous pouvez utiliser une fonction définie par l'utilisateur pour le faire à travers le modèle L2S ... mais vous avez raison, il n'y a pas de support natif pour ce genre de choses. –

+0

Merci. J'utilise effectivement la condition where avec succès, mais j'essayais de creuser la jointure et surtout le mot-clé equals. Vous répondez me lumières parfaitement. – Graveen

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

Ce code est traduit en un appel à Enumerable.Join:

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

A partir de là, il est facile de voir que i est portée pour l'expression de x, alors que j n'est pas.


from i in collectiona 
from j in collectionb 
where z 

est équivalent à:

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

Chaque q a une i et un j disponible pour une utilisation dans l'expression de z.