2013-02-20 1 views
0

Давайте представим, что ниже приведена наша модель данных. Я хочу запросить Игрушки, но результаты возвращены таким образом, что я могу сделать следующий код psuedo.Запрос, что группы Родитель, затем Ребенок, когда выборка из IQueryable <GrandChild>

foreach (var parent in parents) 
      { 
       Console.WriteLine(parent.Name); 

       foreach (var child in parent.Children) 
       { 
        Console.WriteLine(child.Name); 

        foreach (var toy in child.Toys) 
        { 
         Console.WriteLine(toy.Name); 
        } 
       } 
      } 

Модель данных:

public class Parent 
{ 
    public Guid ParentId { get; set; } 
    public String Name { get; set; } 
    public ICollection<Child> Children { get; set; } 
} 
public class Child 
{ 
    public Guid ChildId { get; set; } 
    public Guid ParentId { get; set; } 
    public Parent Parent { get; set; } 
    public String Name { get; set; } 
    public ICollection<Toy> Toys { get; set; } 
} 
public class Toy 
{ 
    public Guid ToyId { get; set; } 
    public Guid ChildId { get; set; } 
    public Child Child { get; set; } 
    public String Name { get; set; } 
    public bool IsCool { get; set; } 
} 

Я пытался сделать это с группировкой, но когда я пытаюсь итерацию группирование все, что я вижу, это ключ, который не имеет никаких свойств на нем так Я не могу получить имя родителя или имя Child.Name.

Заранее спасибо.

ответ

0

С LazyLoadingEnabled установлено значение false, вы сможете сделать это, используя один запрос linq для загрузки всех связанных объектов.

Обратите внимание, что это может вызвать некоторые проблемы с производительностью, если у вас имеется большое количество связанных данных в таблице «Дети или игрушки».

context.ContextOptions.LazyLoadingEnabled = false; 

var parents = context.Parents.Select(x=>x).ToList(); 
foreach(var parent in parents) { 
    Console.WriteLine(parent.Name); 

    foreach(var child in parent.Children) { 
     Console.WriteLine(child.Name); 

     foreach(var toy in child.Toys) { 
      Console.WriteLine(toy.Name); 
     } 
    } 
} 
1

Вы можете сделать:

var query = from p in parents 
      from c in p.Children 
      from t in c.Toys 
      select new { Parent = p.Name, Child = c.Name, Toy = t.Name } 

foreach (var a in query) 
{ 
    // write values. 
} 

В сущности, это использует SelectMany.

Редактировать

После Вашего комментария, я думаю, что вы ищете, не группировку. Если у вас есть объект Parent, его Children уже сгруппированы внутри него, потому что у каждого родителя есть своя коллекция. Но, может быть, вы ищете способ заполнения коллекций? Это будет сделано

var query = from p in parents.Include(x => x.Children.Select(c => c.Toys)); 
+0

Спасибо, но это не совсем то, что я ищу, это то, что у меня есть сейчас, и я пытаюсь уйти. Пока я пишу Parent.Name в примере, мне действительно нужен родительский объект. В этом решении есть каждый элемент, имеющий родителя, который содержит много дублирующихся данных для переноса. Я пытаюсь иметь только одну запись каждого клиента. Я считаю, что мне нужно использовать GroupBy, что вы думаете? –

+0

ОК, см. Мое редактирование. –

+0

@HonorableChow Любая обратная связь? –

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