Mon objectif est de faire un seul voyage dans la base de données et d'obtenir des commandes avec une collection enfant filtrée.Entity Framework 6.1.3: Projection - charge directement les enfants des enfants
Pour ce faire, je l'ai utilisé une projection:
using (var db = new context())
{
var query = from o in db.Orders
select
new
{
Order = o,
Events = o.Events.Where(
e => e.SomeBool
&& e.SomeBool2
),
EventsGroups = o.Events.Where(
e => e.SomeBool
&& e.SomeBool2
).Select(e => e.Groups),
};
}
Le problème ici est que la collection des enfants, « Groupes » sur les événements, n'est pas chargé. Pour résoudre cela, je l'ai chargé comme une autre propriété "EventsGroups" dans la requête, que je peux ensuite mettre en place avec les événements après.
Ma question: Existe-t-il un moyen de charger l'enfant, "Groupes" sur "l'événement" directement, donc je n'ai pas besoin de les obtenir comme une autre propriété?
Le long des lignes de
Events = o.Events.Where(
e => e.SomeBool
&& e.SomeBool2
).Include(e => e.Groups), //this cannot be done this way
Pourquoi suis-je en utilisant une projection et non le chargement impatient:
https://msdn.microsoft.com/en-us/magazine/hh205756.aspx
Filtering include items in LINQ and Entity Framework
Les classes sous-jacentes:
public class Order
{
public Order()
{
Events = new HashSet<Event>();
}
public int Id { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
public class Event
{
public Event()
{
Groups = new HashSet<Group>();
}
public int Id { get; set; }
public bool SomeBool { get; set; }
public bool SomeBool2 { get; set; }
public virtual ICollection<Group> Groups { get; set; }
}
public class Group
{
public Group()
{
Events = new HashSet<Event>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
pouvez-vous essayer 'o.Events.include (e => e.Groups) .Lorsque (...'? – SWilko
Voulez-vous dire à l'intérieur de la projection? Je ne crois pas Inclure existe là http://imgur.com/ZOOXx0E – Archigo
désolé vous avez raison Je pense que @Ivans réponse ci-dessous devrait fonctionner – SWilko