2013-08-09 5 views
9
public class Parent 
{ 
    public ICollection<Child> Children {get;set;} 
} 

public class Child 
{  
} 

public class Boy : Child 
{ 
    public Toy Toy {get;set;}  
} 

public class Girl : Child 
{  
    public Book Book {get;set;} 
} 

Я хочу загрузить всех родителей и загрузить всех детей для каждого родителя, и для каждого Мальчика загрузите игрушку и для каждой девушки загрузите книгу.Яркая нагрузка на свойство полиморфного дочернего объекта

Как написать, используя Linq Include()?

+0

возможный дубликат [EF 4.3.1 Включить унаследованные свойства навигации в запросе LinqToEntities] (http://stackoverflow.com/questions/10705218/ef-4-3-1-include-inherited-navigation-properties-in-linqtoentities-query) –

+0

@ Гертарнолд, это не дубликат. 'Дети' - это полиморфная коллекция, а не унаследованное свойство навигации. Ян, ты нашел решение? Я тоже смотрю. – Kit

+0

@kit В прошлый раз, когда я смотрел, жадная загрузка, похоже, улучшается. Я не уверен, исправляет ли это это. :) –

ответ

2

не может быть сделано с Include, но может быть сделано с помощью проекции - EF будет телеграфировать навигационные свойства для вас, пока вы выбираете эти объекты (отслеживание изменений должны быть включены):

var query = db.Parents.Select(p => new 
{ 
    Parent = p, 
    // get the children entities for the parent 
    Children = p.Children, 
    // get the toys for the parent's boys 
    Toys = p.Children.OfType<Boy>().Select(b => b.Toy), 
    // get the books for the parent's girls 
    Books = p.Children.OfType<Girl>().Select(g => g.Book), 
}); 

var results = query.ToArray().Select(at => at.Parent); 
+0

+1 Спасибо. Есть ли способ сделать это, что не требует 'ToArray()', поэтому я могу использовать его в методе, способном к цепочке, на 'IQueryable <>'? – Ergwun

+0

Несомненно, вы просто не можете проецировать 'at.Parent' только до тех пор, пока не перечислите запрос – Moho

+0

Cheers. Награда Bounty - спасибо :) – Ergwun

Смежные вопросы