2010-11-04 6 views
1

J'ai une table AccountSecurity qui est une table many-to-many qui relie les entités de compte et les valeurs. Lorsque j'écris la requête ci-dessous, elle renvoie toutes les valeurs qui satisfont la clause where. Cependant chaque instance de sécurité dans la liste n'a plus la référence à la sécurité de compte d'où elle provient. Donc quand je fais la liste [0] .AccountSecurity c'est vide. Est-il possible d'inclure cette information? Je sais que je peux réécrire la requête pour retourner AccountSecurities à la place et utiliser .Include ("Security") sur cela, mais je me demande si cela peut être fait d'une autre manière.Entity Framework, Comment inclure les entités associées dans cet exemple

var list = (from acctSec in base.context.AccountSecurities 
      where acctSec.AccountId == accountId 
      select acctSec.Security).ToList(); 

MISE À JOUR

Bien sûr, si je fais deux requêtes le graphique se jour correctement, il doit y avoir une façon de le faire en un seul coup.

var securities = (from acctSec in base.context.AccountSecurities 
      where acctSec.AccountId == accountId 
      select acctSec.Security).ToList(); 

//this query populates the AccountSecurities references within Security instances returned by query above 
var xref = (from acctSec in base.context.AccountSecurities 
      where acctSec.AccountId == accountId 
      select acctSec).ToList(); 

Répondre

6
var list = (from sec in base.context.Securities 
            .Include("AccountSecurity") 
      where sec.AccountSecurities.Any(as => as.AccountId == accountId) 
      select sec).ToList(); 
+0

AccountSecurity est une table plusieurs-à-plusieurs. Cela signifie qu'il n'y a que sec.AccountSecurities car une seule sécurité peut appartenir à plusieurs comptes. J'ai essayé de faire sec.AccountSecurities [0] .AccountId == accountId mais cela jette une exception. – e36M3

+0

Réécrit le où pour beaucoup à beaucoup. –

+0

merci! J'ai couru ceci à travers et le seul problème que je vois avec ceci est que les titres retournés auront tous une référence à tous les comptes auxquels ils appartiennent, pas seulement celui spécifié par accountId. En d'autres termes, si j'ai 5 titres, mais que ces 5 titres sont mappés à 2000 comptes, alors j'ai 5x2000 lignes retournées. Je pense qu'il pourrait être plus efficace de faire deux requêtes pour remplir le graphique avec les valeurs en premier, puis l'information acccountsecurity (many-to-many) plus tard. – e36M3

1

Essayez ceci:

var list = (from acctSec in base.context.AccountSecurities.Include("Security") 
      where acctSec.AccountId == accountId 
      select acctSec).ToList(); 

Ensuite, utilisez simplement la propriété de sécurité au besoin, et comme il est lu au AccountSecurities même temps, est (un seul SQL avec jointure), il sera très efficace.

+0

cela retournera une liste d'entités AccountSecurity et pas d'entités de sécurité. Je sais que je peux facilement les récupérer via AccountSecurity.Security mais j'ai un autre problème en jeu ici. Je ne vais pas à ToList() tout de suite comme je l'ai décrit plus tôt. Je les lance à travers une méthode que j'ai écrite pour trier/feuilleter dynamiquement ces résultats. Longue histoire courte j'ai besoin des entités de niveau supérieur qui sont retournées pour être de type Sécurité. – e36M3

+0

Ensuite, sauf si vous sélectionnez également l'objet AccountSecurity d'origine en même temps, vous perdrez le lien. par exemple. ... sélectionnez nouveau {Acct = acctSec, Sec = acctSec.Security} .... Alternativement, pourquoi ne pas utiliser Linq pour faire le tri/pagination pour vous? par exemple. Passer et prendre des méthodes? De cette façon, il vous permet de sélectionner tout ce que vous voulez, de le trier, de faire la pagination. Tout en un effrayant (long) ligne de bonté linq. – Will

+0

J'utilise Linq pour trier. Cependant, c'est une méthode "dynamique" que j'ai écrite qui prend une chaîne comme l'expression de tri qui représente une propriété de l'entité de premier niveau par laquelle trier, une direction de tri, et IQueriable. Cette méthode ne fonctionnera pas, sauf si l'entité de niveau supérieur (racine) dans cette IQueriable correspond à l'expression de tri. Si je devais lui passer AccountSecurity en tant que root et SecurityName en tant qu'expression de tri, il exploserait. Donc vous voyez que je suis dans un pétrin ici :) Il se peut que je doive le faire dans deux requêtes que j'ai posté dans ma note de mise à jour dans le message principal. – e36M3

Questions connexes