2009-04-17 5 views
1

J'essaie d'écrire une méthode d'extension pour un référentiel. Le référentiel a une méthode IQueryable<parent> GetAll(). Je veux créer une méthode extention FilterByChildId (int childId) pour que je puisse écrire:Jointure interne à l'intérieur de la méthode d'extension (linq)

List<parent> data = from d in repository.getAll().FilterByChildId(33).ToList() 

Je ne sais pas comment faire le rejoindre sur le parent et l'enfant à l'intérieur de la méthode d'extension. Je thoudht ce serait quelque chose comme:

public static IQueryable<parent> FilterByChildId(
    this IQueryable<parent> query, 
    int id) 
{ 
    return from data in query where data.child.id == id select data 
} 

mais pas une chance. J'ai essayé toutes sortes de variations en utilisant join, groupjoin mais pas en cliquant. Toute aide serait appréciée.

+0

Comment la relation entre parent et enfant est-elle définie? – Jeremy

Répondre

2

J'écrirais essentiellement la même chose que vous.

public static IQueryable<Parent> FilterByChildId(
    this IQueryable<Parent> parents, Int32 id) 
{ 
    return parents.Where(p => p.Child.Id == id); 
} 

Je viens de le vérifier avec l'un de mes modèles Entity Framework et cela fonctionne. J'ai supposé une relation simple (parent) à une (enfant) comme votre code l'indique. Notez que c'est un peu déroutant - beaucoup de parents pour un enfant. Se pourrait-il que vous ayez une relation de plusieurs à plusieurs? Un parent peut avoir plusieurs enfants et un enfant peut avoir plusieurs parents? Alors le proeprty Childs (child dans votre code) serait une collection et le code doit être changé comme suit.

public static IQueryable<Parent> FilterByChildId(
    this IQueryable<Parent> parents, Int32 id) 
{ 
    return parents.Where(p => p.Childs.Any(c => c.Id == id)); 
} 

Le troisième acceuillent un parent avec beaucoup de Childs. La deuxième méthode fonctionnera pour ce cas, mais retournera toujours au plus un parent en supposant que les identifiants enfants sont uniques.

Questions connexes