2011-11-10 4 views
0

J'ai une collection d'objets dans mon dépôt EF appelé Territories. Un Territory est lié à beaucoup Distributions, et chaque Distribution en a un CycleID.EF obtenir des objets connexes spécifiques

Comment puis-je écrire une requête sur EF qui saisira tous les objets Territory et associés Distributions qui appartiennent à un Cycle spécifique, ignorant toute Territories qui n'ont pas de qualification Distributions?

Je suis quelque chose comme imaginer:

return this.entities.Territories 
    .Include("Distributions") 
    .Include("Reps") 
    .Where(e => e.Distributions.Any(d => d.CycleID == CycleID)) 
    .OrderBy(e => e.TerritoryName) 
    .AsEnumerable(); 

mais je collectionne mauvais Distributions. Je peux voir ce qu'il fait, mais je n'arrive pas à comprendre comment le faire faire ce que je veux.

Répondre

1

Il semble que vous choisissiez le mauvais point d'entrée pour votre graphe d'objets. Commencez avec ce que vous savez (le Cycle spécifique) et revenez aux éléments que vous souhaitez récupérer (Distributions et Territories).

var cycle = this.entities.Cycles.Single(c => c.CycleID == cycleID); 

return cycle.Include("Distributions") 
    .Include("Territories") 
    .Include("Territories.Reps"); 

Selon la façon dont vous utilisez le résultat, vous pouvez le transformer en Enumerable<Territory>

return cycle.Distributions.SelectMany(d => d.Territories) 
    .OrderBy(t => t.TerritoryName) 
    .AsEnumerable(); 

Vous pourriez avoir à jouer avec les déclarations Include parce que mon EF est un peu rouillé.

+0

je fini par faire quelque chose de très semblable à cela. –

0

Essayez ceci:

var entities = new TestEntities(); 
     var cycleId = 1; 
     var filteredDistributions = entities.Territories 
            .Join(entities.Distributions.Where(d => d.CycleId == cycleId), 
              territory => territory.Id, 
              distribution => distribution.Territory.Id, 
              (territory, distribution) => distribution); 
Questions connexes