2012-04-29 3 views
2

Je suis à la recherche du meilleur moyen de charger et de filtrer les entités enfants associées. J'ai quelque chose qui fonctionne, mais je ne sais pas si c'est la meilleure ou même la bonne façon de réaliser ce que je veux. Exemple de code de travail ci-dessous. Avantages et inconvénients serait génial! Merci!Filtrage des entités liées avec Entity Framework

public Site Find(int siteID) 
{ 
    // Can't use include here, not possible to filter related (child) entities 
    // return _context.Sites.Where(x => x.ID == siteID) 
    //      .Include("SiteLoggers") 
    //      .Where(x => x.Deleted == false) 
    //      .FirstOrDefault(); 

    var site = _context.Sites.Where(x => x.ID == siteID).FirstOrDefault(); 

    if(site != null) 
    { 
     site.SiteLoggers = site.SiteLoggers.Where(x => x.SiteID == siteID && 
                 x.Deleted == false) 
              .ToList(); 
    } 

    return site; 
} 

EDIT:

Ajouté POCOS

public class Site 
{ 
    public int ID { get; set; } 
    public int LocationID { get; set; } 
    public bool Active { get; set; } 
    public bool Deleted { get; set; } 
    public string Name { get; set; } 
    public virtual Location Location { get; set; } 
    public virtual ICollection<SiteLogger> SiteLoggers { get; set; } 
    public virtual ICollection<LinkDcSite> DcSiteLinks { get; set; } 
} 

public class SiteLogger 
{ 
    public int ID { get; set; } 
    public int UID { get; set; } 
    public int SiteID { get; set; } 
    public int LocationID { get; set; } 
    public string Name { get; set; } 
    public bool Active { get; set; } 
    public bool Deleted { get; set; } 
    public virtual Site Site { get; set; } 
    public virtual Location Location { get; set; } 
    public virtual ICollection<SiteLoggerSensor> SiteLoggerSensors { get; set; } 
    public virtual ICollection<LinkLoggerSiteLogger> LinkLoggerSiteLogger { get; set; } 
} 

Répondre

0

Vous pouvez le faire avec une simple requête:

var site = _context.SiteLoggers.Where(sl => sl.SiteId = siteId && !sl.Deleted).ToList(); 

S'il y a une relation entre SiteLoggers et Sites, vous n » t besoin de vérifier que le site existe.

+0

Hi. Dans votre exemple, votre requête renvoie juste une collection de SiteLoggers et non un site, mais dites-vous que je peux obtenir le site via la collection SiteLoggers? I.e var siteLoggers = _context.SiteLoggers.Where (x => x.SiteID == siteID &&! X.Deleted); Site site = null; si (siteLoggers! = Null) site = siteLoggers.FirstOrDefault(). Site; site de retour; – Matt

+0

Bien sûr que vous pouvez, mais pas de cette façon. Utilisez-vous DbContext ou ObjectContext? Les choses sont un peu différentes. Vous devriez lire sur le chargement impatient, le chargement paresseux et le chargement explciit. Cela dépend aussi de votre modèle. Y a-t-il une relation entre le site et les siteloggers? Quel genre de relation. Il y a beaucoup d'informations manquantes pour donner une réponse complète – JotaBe

+0

Salut. J'utilise DbContext. Oui, il y a une relation comme vous pouvez le voir dans les POCOs. Je ne suis pas un expert mais j'ai fait des recherches sur le chargement avide, paresseux et explicite. C'est pourquoi j'ai d'abord utilisé la méthode d'inclusion, car cela semblait une bonne idée de charger avec impatience les SiteLoggers, étant donné qu'il y en aura seulement 5 environ. – Matt

1

Votre méthode est très bien je pense que vous avez juste un contrôle supplémentaire pour x.SiteID == siteID:

.... 
site.SiteLoggers = site.SiteLoggers.Where(x => !x.Deleted).ToList(); 
.... 

Aussi, si vous la recherche par ID signifie que vous êtes sûr qu'il n'y a pas d'élément deux avec la même ID, il est donc préférable d'utiliser SingleOrDefault au lieu de FirstOrDefault, pour lancer une exception dans le cas, il y a plus d'un élément avec un ID.

var site = _context.Sites.Where(x => x.ID == siteID).SingleOrDefault(); 
+0

Bon point. Merci! – Matt

+0

@Matt, Si cela vous aide, vous pouvez le classer ou l'accepter comme réponse. –

+0

Bonjour. Avoir faire. Qu'est-ce que vous pensez de mes commentaires sur l'autre poste? – Matt

Questions connexes