2015-09-05 3 views
0
public class Module 
{ 
    public int id { get; set; } 
    public string moduleName { get; set; } 
    //navigation property 
    public virtual HashSet<Policy> policies { get; set; } 
} 

public class Policy 
{ 
    public int id { get; set; } 
    //foreign keys 
    public int subscriberId { get; set; } 
    //navigation properties 
    public virtual Subscriber subscriber { get; set; } 
} 

public class Subscriber 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public int subscriptionId { get; set; } 
    // Navigation property 
    public virtual HashSet<Policy> policies { get; set; } 
} 

У меня есть 3 связанных объекта.Запрос вложенной таблицы Entity Framework в JSON

Модуль - Политика - Subscriber

  • Модуль имеет несколько политик
  • политик имеет один абонент

Мне нужно перечислить все политики и абонент под определенным модуль в формате JSON. Из-за сообщений, которые я нашел в Интернете, я создал этот запрос:

 return db.modules 
      .Where(m => m.id == id) 
      .Include (m => m.policies.Select(p => p.subscriber)) 
      .Select(m => new { 
       m.id, 
       m.moduleName, 
       m.policies 
      }) ; 

Это результат лишь приведенный ниже. ? Как вы можете видеть детали объекта абонентским политики нет (NULL) :(Что случилось

[{"id":1,"moduleName":"module1", 
    "policies":[{"id":1,"subscriberId":1,"subscriber":null}]}] 

ответ

0

Поскольку вы используете динамики в вашем Выбор метода, вы должны построить все это так:

return db.modules 
    .Where(m => m.id == id) 
    .Include (m => m.policies.Select(p => p.subscriber)) 
    .Select(m => new { 
     m.id, 
     m.moduleName, 
     policies = m.policies.Select(p => new 
     { 
      p.id, 
      p.subscriberId, 
      subscriber = new 
      { 
       p.subscriber.id, 
       p.subscriber.name, 
       p.subscriber.subscriptionId, 
      } 
     } 
    }); 

Я обычно использую реальные классы DTO, так что если когда-либо нуждается в Dto обновить, рефакторинг будет работать должным образом, я бы также рассмотреть возможность использования DtoFactory обрабатывать конструкцию, но вы можете сделать это с помощью LINQ, как это:.

public class ModuleDto 
{ 
    public int id { get; set; } 
    public string moduleName { get; set; } 
    public IEnumerable<PolicyDto> policies { get; set; } 
} 
public class PolicyDto 
{ 
    public int id { get; set; } 
    public int subscriberId { get; set; } 
    public SubscriberDto subscriber { get; set; } 
} 
public class SubscriberDto 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public int subscriptionId { get; set; } 
}  

...other code here... 

return db.modules 
    .Where(m => m.id == id) 
    .Include (m => m.policies.Select(p => p.subscriber)) 
    .Select(m => new ModuleDto { 
     m.id, 
     m.moduleName, 
     policies = m.policies.Select(p => new PolicyDto 
     { 
      p.id, 
      p.subscriberId, 
      subscriber = new SubsciberDto 
      { 
       p.subscriber.id, 
       p.subscriber.name, 
       p.subscriber.subscriptionId, 
      } 
     } 
    }); 

Немного грязно читать инструкцию linq. Вот почему я обычно использую DtoFactory для создания Dtos из моделей.

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