2010-06-25 12 views
2

Nous avons 3 tables dans notre base de données qui ont chacune une entité dans notre edmx. Pour illustrer mon problème, imaginez 3 tables:Entity Framework 4.0 - Y compris les entités - Problème de chargement Eager

Table: Make 
Fields: 
makeID 
make 

Table: Model 
FIelds: 
modelID 
makeID foreign key 
model 

Table: Car 
carID 
modelID foreign key 
car 

Nos entités Make, Model et Car ont toutes les propriétés de navigation dans le modèle d'entité. Le chargement paresseux est désactivé. Nous voulons être en mesure de tirer toutes les voitures qui sont Jeep Grand Cherokees à la sortie de notre page.

En ce moment, nous avons quelque chose comme ça dans l'une de nos fonctions (C# 4,0)

IEnumerable<Make> makeList = (((ObjectSet<Lot>)_modelRepository.GetQuery()) 
     .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee")) 
     .Where(mk => mk.make == "Jeep").ToList()); 

_makeRepository.GetQuery() retourne un IQueryable ... nous mettre en œuvre le modèle référentiel

Cette requête devrait fonctionner correctement (havre de paix pas testé, créé pour cet exemple) mais comment pouvons-nous .Include la table de la voiture pour que notre fonction retourne Faire des objets d'entité tels que le modèle est peuplé et les voitures sont peuplées (problème d'obtenir les voitures parce qu'ils n'ont pas une navigation directe propriété à faire)

Nous utilisons des objets POCO.

L'objectif est d'avoir une fonction qui retourne une entité livrerai pour être en mesure de le faire:

foreach(Make myMake in makeList) 
{ 
    Response.Write(myMake.make); 

    foreach(Model myModel in myMake.Models) 
    { 
     Response.Write(myModel.model); 

     foreach(Car mycar in myModel.Cars) 
     { 
       Response.Write(mycar.car); 
     } 
    } 
} 

Quelque chose comme cela ne semble pas possible, mais son que nous allons pour:

IEnumerable<Make> makeList = (((ObjectSet<Lot>)_modelRepository.GetQuery()) 
     .Include(mk => mk.Models.Where(md => md.model == "Grand Cherokee")) 
     .Include(c => mk.Models.Cars) 
     .Where(mk => mk.make == "Jeep").ToList()); 

J'ai également essayé de créer une nouvelle entité dans mon edmx qui contient toutes ces informations afin que je puisse simplement interroger cet objet mais je reçois des erreurs en disant que les clés doivent être mappées ... Je les ai cartographiées dans le Mapping onglet (Visual Studio 2010) ... donc je suis de retour à essayer de faire fonctionner la requête.

Répondre

2

Je ne suis pas sûr à 100% mais je crois que vous allez avoir besoin de créer une sorte de DTO comme ceci:

public MakeModelCarDto 
{ 
    public IEnumerable<Make> Makes {get; set;} 
    public IEnumerable<Model> Models {get; set;} 
    public IEnumerable<Car> Cars {get; set;} 
} 

Ensuite, vous allez devoir rejoindre les tables comme ceci:

_makeRepository.GetQuery() 
     .Join(_modelRepository.GetQuery(), mk => mk.makeid, mo => mo.makeid, (mk, mo) => new { mk, mo }) 
     .Join(_carRepository.GetQuery(), @t => @t.mo.modelid, c => c.modelid, (@t, c) => new { @t, c }) 
     .Where(@t => @[email protected] == "Jeep" && @[email protected] == "Grand Cherokee") 
     .Select(@t => new MakeModelCarDto 
     { 
      Makes = @[email protected], 
      Model = @[email protected], 
      Cars = @t.c 
     }).SingleOrDefault();