2010-11-23 4 views
1

Edité le dernier numéro/préoccupationaux entités et LINQ plusieurs à plusieurs

J'utilise EF1 et essayer de faire ce qui suit, mais ayant des problèmes avec mes nombreux à plusieurs. J'ai la méthode d'extension BuildExpression qui fonctionne pour contourner .Contains() n'étant pas disponible dans EF1.

PagingUsers & Les groupes ont une relation plusieurs-à-plusieurs.

Voici ce que j'ai jusqu'à présent qui fonctionne.

// Find many groups 
public IQueryable<Group> FindGroupsByGroupIDs(List<int> group_ids) 
{ 
    return db.Groups.Where(LINQHelpers.BuildContainsExpression<Group, int>(g => g.Group_ID, group_ids)); 
} 

// Find users in a group 
public IQueryable<PagingUser> FindPagingUsersByGroupID(int group_id) 
{ 
    return db.PagingUsers.Include("Groups").Where(u => u.Groups.Any(g => g.Group_ID == group_id)); 
} 

Maintenant, je voudrais combiner ces derniers et trouver les utilisateurs qui se trouvent dans une liste de groupes.

public IQueryable<PagingUser> FindPagingUsersByGroupIDs(List<int> group_ids) 
{ 
    return from g in db.Groups.Where(LINQHelpers.BuildContainsExpression<Group,int>(g => g.Group_ID, group_ids)) 
      join p in db.PagingUsers on ??? 
      select p; 
} 

Répondre

1

Cette requête fonctionne tel quel dans .NET 4.0. Pour .NET 3.5, recherchez "BuildContainsExpression".

+0

Résolu mes types ne peut pas être déduit problème, mais ma relation plusieurs à plusieurs complique l'expression – ryan

2

Essayez ceci:

public IQueryable<PagingUser> FindPagingUsersByGroupIDs(List<int> group_ids) 
{ 
    var gids = group_ids.ToArray(); 
    return from p in db.PagingUsers 
      where p.Groups.Any(g => gids.Contains(g.Group_ID)) 
      select p; 
} 

Quant à la deuxième question: quel lambda voulez-vous vous débarrasser? L'intérieur ou l'extérieur? Et pourquoi?

+0

LINQ to Entities ne reconnaît pas la méthode 'Boolean Contient [Int32] (System.Collections.Generic.IEnumerable1 [System.Int32], Int32)', et cette méthode ne peut pas être traduite dans une expression de magasin. – ryan

+0

@ryan Il devrait cependant pour un tableau. – Enigmativity

+0

Pas pour EF1. A des problèmes avec tout IEnumerable autant que je sache – ryan

1

Réponse à la deuxième question:

Je ne comprends pas pourquoi vous convertir en un Majuscules lié. Pour vos informations aimables, la requête Linq n'est pas sensible à la casse si vous voulez qu'elle soit répétée de manière sensible à la casse. Vous devriez faire la liste de la liste ou du premier élément comme cela dépend, ce que vous obtenez en exécutant le LINQ. -grammatically et rechercher les cas.

Questions connexes