2010-10-06 4 views
0

je la structure de tableau suivant:Comment LINQ beaucoup à beaucoup avec OR recherche?

Tableau utilisateurs

ID | Name 
1 | John 
2 | Ted 
3 | Alice 
4 | Barney 

et de table UserLanguages ​​

ID | UserID | Language 
1 | 1  | 1 
2 | 1  | 5 
3 | 2  | 2 
4 | 2  | 3 
5 | 3  | 3 
6 | 4  | 4 
7 | 4  | 5 

Je vérifie langues 2,3 et et je veux les utilisateurs 2,3,4. Je veux obtenir des utilisateurs qui ont au moins quelque chose de langues choisies (ou 2 ou 3 ou 4) Comment obtenir avec LINQ?

Répondre

1

Quelque chose comme cela devrait fonctionner:

var query = from u in db.Users 
      join l in db.UserLanguages on u.ID equals l.UserID 
      group l.Language by u into langs 
      where langs.Any(l => l == 2 || l == 3 || l == 4) 
      select langs.Key; 

Ma suggestion d'utiliser constructeur de prédicat est trop compliqué. IEnumerable<T>.Contains() fonctionne apparemment dans LINQ-to-SQL (que je ne connaissais pas). Cela devrait être beaucoup plus facile.

var languages = new[] { 2, 3, 4 }; 
var query = from u in db.Users 
      join l in db.UserLanguages on u.ID equals l.UserID 
      group l.Language by u into langs 
      where langs.Any(l => languages.Contains(l)) 
      select langs.Key; 
+0

Comment puis-je écrire, quand je don Je ne connais pas les langues de recherche. 'int [] languages ​​= nouveau [] {2,3,4}; var résultat = query.Where (x => x.WorkTypes.Any (y => workTypes)); ' – Dmitriy

+0

Je suis désolé, je ne comprends pas ce que vous demandez. Pourriez-vous reformuler votre question? –

+0

Comment les tableaux d'utilisation de requête de construction? '.Any (x => x.ArrayOfNeedLanguages)' – Dmitriy

0

Vous pouvez utiliser quelque chose comme Jon Skeet suggéré dans votre question précédente (How search LINQ with many parametrs in one column?)

Cela devrait fonctionner, mais il n'a pas été testé:

int[] languages = new[] {2, 3, 4}; 
var query = dataContext.UserLanguages 
    .Where(ul => languages.Contains(ul.Language)) 
    .Select(ul => ul.User) 
    .Distinct(); 
+0

Oh je n'ai pas réalisé 'IEnumerable .Contains()' fonctionne dans LINQ-to-SQL. Jamais travaillé pour moi avant. :) –

+0

@Jeff - Oui, il faut faire attention quand on l'utilise, ça ne marche pas pour n'importe quel scénario auquel on peut s'attendre, je frappe aussi plusieurs fois une impasse. Voir ce joli message de Rob Conery avec plus de détails: http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/ –

+0

Ah tu sais quoi, j'ai en utilisant 'Any()' à la place et en testant simplement l'égalité qui est plus ou moins sémantiquement la même chose. _That_ ne fonctionne pas. –

Questions connexes