Моя цель - сделать только одну поездку в базу данных и получить Заказы с фильтрованной дочерней коллекцией.Entity Framework 6.1.3: Проекция - загрузка детей детей напрямую
Для достижения этой цели я использовал проекции:
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),
};
}
Проблема здесь в том, что сбор ребенка, «Группы» о событиях, не загружен. Чтобы решить эту проблему, я загрузил ее как другое свойство «EventsGroups» в запросе, которое затем я смогу вместе с событиями впоследствии.
Мой вопрос: Есть ли способ загрузить ребенка «Группы» в «Событие» напрямую, так что мне не нужно их использовать в качестве другого имущества?
Вдоль линий
Events = o.Events.Where(
e => e.SomeBool
&& e.SomeBool2
).Include(e => e.Groups), //this cannot be done this way
Почему я, используя проекцию, а не жадной загрузки:
https://msdn.microsoft.com/en-us/magazine/hh205756.aspx
Filtering include items in LINQ and Entity Framework
Базовые классы:
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; }
}
вы можете попробовать 'o.Events.include (е => e.Groups) .где (...'? – SWilko
Вы имеете в виду внутри проекции? Я не верю, что Include существует там http://imgur.com/ZOOXx0E – Archigo
извините, что вы правы. Я думаю, что ответ @Ivans ниже должен работать. – SWilko