2010-07-08 5 views
1

J'ai la commande suivante:Entity Framework - charge les données de la table avec la table 1: 1 impliquée en utilisant une requête?

var query = from x in context.FirstTable.Include("SecondTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 

Maintenant, je veux aussi charger les entrées d'une troisième table nommée « ThirdTable ». Mais je ne peux que le référencer via la table SecondTable. Il existe une clé étrangère de FirstTable à SecondTable et une de SecondTable à ThirdTable, mais aucune de FirstTable à ThirdTable.

en utilisant la requête suivante n'était pas possible. L'exception est qu'il ne peut pas naviguer de FirstTable à ThirdTable:

var query = from x in context.FirstTable.Include("SecondTable").Include("ThirdTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 

Ou je dois faire une requête supplémentaire sur ThirdTable pour chaque resultset je reviens de cette requête?

Merci beaucoup d'avance!

Craig Stuntz:

je les clés étrangères suivantes: table1 < -> table2 < -> table3
disons que les tableaux sont de la façon suivante: les commandes < -> clients < -> customer_preferences

Je n'ai donc pas besoin de faire une clé étrangère des commandes aux préférences client.
Ce serait inutile la plupart du temps. Juste cette fois, je veux sécuriser certains tours de la base de données supplémentaires.

+0

Avez-vous une * très bonne raison * de n'avoir aucun FK à chaque extrémité? –

+0

J'ai des clés étrangères, mais les FK de Table1 à Table3 sont à mon avis inutiles. S'il vous plaît voir mon post mis à jour. ou pensez-vous que je devrais ajouter le customer_preference_id dans la table des commandes? – Chris

+0

OK, on ​​dirait que vous avez les FK dont vous avez besoin, alors. Je vais répondre ci-dessous. –

Répondre

2

Vous pouvez le faire via le chargement impatient:

var query = from x in context.FirstTable.Include("SecondTable.ThirdTable") // remember, these are property names, not table names 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select x; 

Ou (ce qui est la méthode J'utilise, la plupart du temps) la projection:

var query = from x in context.FirstTable 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select new PresentationModel 
      { 
       FirstTableColumn = x.Something, 
       SecondTableColumn = x.SecondTable.SomethingElse, 
       ThirdTableColumn = x.SecondTable.ThirdTable.StillMore 
      }; 

Cela suppose SecondTable: ThirdTable est 1: 1 (vous ne dites pas). Si c'est 1: *, vous feriez quelque chose comme:

var query = from x in context.FirstTable 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select new PresentationModel 
      { 
       FirstTableColumn = x.Something, 
       SecondTableColumn = x.SecondTable.SomethingElse, 
       ThirdTableStuff = from y in x.SecondTable.ThirdTable 
            select y.StillMore 
      }; 
+0

Merci, c'était exactement ce que je cherchais! – Chris

1

Si je me souviens bien, l'inclusion ne fonctionne que pour la première table. Vous pouvez faire quelque chose comme ceci:

var query = from x in Invoices 
    join p in Products 
    on x.Invoice_id equals p.Invoice_id 
    join c in Customers 
    on x.Customer_id equals c.Customer_id 
    where p.Customer_id == 123 
    && c.Description == "some description" 
    select x; 

Vous pouvez également essayer quelque chose comme ça

var query = from x in context.FirstTable.Include("SecondTable").Include("SecondTable.ThirdTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 
+1

Dans les requêtes EF, les jointures ne sont presque jamais requises (si vous avez un db correctement structuré et un modèle correctement défini). En fait, votre réponse est un bon exemple de pourquoi une requête sans jointure est plus lisible. Btw, si le chargement hâtif est activé, le graphe d'entité entière sera récupéré, et les Inclure ne seront pas nécessaires. – Yakimych

Questions connexes