Inclure des entités imbriquées à l'aide de LINQ
Je suis déconner avec LINQ pour la première fois, et je suis en utilisant EF 4.1 le premier code.
J'ai entités contenant des Listes imbriquées d'autres entités, par exemple:
class Release
{
int ReleaseID { get; set; }
string Title { get; set; }
ICollection<OriginalTrack> OriginalTracks { get; set; }
}
class OriginalTrack
{
int OriginalTrackID { get; set; }
string Title { get; set; }
ICollection<Release> Releases { get; set; }
ICollection<OriginalArtist> OriginalArtists { get; set; }
}
class OriginalArtist
{
int OriginalArtistID { get; set; }
string Name { get; set; }
ICollection<OriginalTrack> OriginalTracks { get; set; }
}
Je me demande quel est le moyen le plus rapide, dans une requête LINQ, d'obtenir tous les renseignements sur le lieu où ReleaseID == some value
.
J'ai fait mes devoirs, mais ont trouvé des solutions qui nécessitent implicite de la reconstruction d'un objet (généralement anonymes) avec les données requises. Je veux que les données de la base de données dans le format exact qu'il est tenu au sein de la base de données, c'est à dire en tirant un Communiqué de l'objet avec les ReleaseID tire et remplit toutes les OriginalTrack et OriginalArtist données dans les Listes.
Je sais à propos de Include()
, mais je ne suis pas sûr de la façon de l'appliquer pour plusieurs entités.
Toute aide grandement appréciée.
Vous devez vous connecter pour publier un commentaire.
Ne vous inquiétez pas à l'aide de l'inclure ici
juste faire quelque chose comme
Doit se charger de toutes vos données
J'ai travaillé avec des informations provenant de ce post ici.
http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx
Utilisation
Include
. C'est le but deInclude
, et il n'y a aucune raison d'écrire un tas d'imbrication des instructions select.C'est plus simple à écrire, plus simple à lire, et préserve votre structure de données existantes.
À utiliser
Include
vous devez spécifier le nom de la propriété que vous voulez de retour - cela signifie que le nom tel qu'il existe dans votre code, pas dans la base de données. Par exemple:.Include("OriginalTracks")
comprendra la OriginalTracks de propriété sur chaque Version.Include("OriginalTracks.OriginalArtist")
comprendra OriginalTracks de propriété sur chaque Version, et la OriginalArtist sur chaque Piste (noter qu'il n'est pas possible - du point de vue syntaxique ou logiquement inclure un OriginalArtist à l'intérieur, y compris la OriginalTrack).Include("OriginalTracks").Include("OtherProperty")
comprendra la OriginalTracks et OtherProperty objets sur chaque Version.Vous pouvez enchaîner autant que vous le souhaitez, par exemple:
est parfaitement valide. La seule exigence est que vous mettez le
Include
sur l'EntitySet, pas sur une requête, vous ne pouvez pas.Where().Include()
.Include
aprèsWhere
(ou tout autreIQueryable
méthode) carInclude
s'étendIQueryable
. Voir github.com/mono/entityframework/blob/master/src/EntityFramework/...Pour inclure les entités imbriquées sans l'aide de littéraux de chaîne, utilisez
Select
, comme ceci: