实体框架嵌套表查询到JSON

时间:2015-09-05 04:35:01

标签: c# json lambda nested entity-framework-5

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个相关的对象。

  

模块 - 政策 - 订阅者

  • 模块有多个政策
  • 政策有一个订阅者

我需要以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}]}]

1 个答案:

答案 0 :(得分:0)

由于你在Select方法中使用动态,你必须像这样构建它:

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的原因。