2015-05-24 107 views
2

我有一类名为客户,看起来像这样:实体框架的JSON - 分组数据

public class Client 
{ 

    [Key, ForeignKey("BaseAssignments")] 
    public int ClientId { get; set; } 
    public string Owner { get; set; } 
    public string CompanyName { get; set; } 

    public virtual ICollection<BaseAssignment> BaseAssignments { get; set; } 
} 

和A类名为基地看起来像这样:

public class Base 
{ 
    [Key, ForeignKey("BaseAssignments")] 
    public int BaseId { get; set; } 
    public string BaseName { get; set; } 
    public DateTime BaseStart { get; set; } 
    public DateTime BaseEnd { get; set; } 

    public virtual ICollection<BaseAssignment> BaseAssignments { get; set; } 
} 

他们是与另一个类叫做BaseAssignment

public class BaseAssignment 
{ 
    [Key] 
    public int BaseAssignmentId { get; set; } 
    public int BaseId { get; set; } 
    public int ClientId { get; set; } 

    public virtual Base Base { get; set; } 
    public virtual Client Client { get; set; } 
} 

这个想法是一个客户端可以分配到很多基地,而一个基地可以包含很多客户端。

向前迈进,我试图以这样的方式序列化基本实体,即基本的json表示将所有客户端的集合作为子对象。我想要实现这个一个Web API方法是:

db.Configuration.ProxyCreationEnabled = false; 
var query = from b in db.Bases 
    group b by b.BaseId into nb 
    join ba in db.BaseAssignments on nb.FirstOrDefault().BaseId equals ba.BaseId 
    join c in db.Clients on ba.ClientId equals c.ClientId 
    select new BaseDTO 
    { 
     BaseName = nb.FirstOrDefault().BaseName, 
     BaseStart = nb.FirstOrDefault().BaseStart, 
     BaseEnd = nb.FirstOrDefault().BaseEnd, 
     Clients = from c1 in db.Clients select new ClientDTO 
     { 
      ClientId = c1.ClientId, 
      CompanyName = c1.CompanyName, 
      Owner = c1.Owner 
     } 
    }; 
return query; 

其中BaseDTO样子:

public class BaseDTO 
{ 
    public String BaseName { get; set; } 
    public DateTime BaseStart { get; set; } 
    public DateTime BaseEnd { get; set; } 

    public IQueryable<ClientDTO> Clients { get; set; } 
} 

ClientDTO样子:

public class ClientDTO 
{ 
    public int ClientId { get; set; } 
    public string Owner { get; set; } 
    public string CompanyName { get; set; } 
} 

截至目前,我收到一个错误,指出ClientDTO是一个意外的类型。我能做些什么来解决这个问题,或者我选择的方式是完全错误的?预先感谢您对此的任何见解。

编辑

我做了一些更改网络API控制器的方法,所以它看起来像:

db.Configuration.ProxyCreationEnabled = false; 
var query = from b in db.Bases 
    group b by b.BaseId into nb 
    join ba in db.BaseAssignments on nb.FirstOrDefault().BaseId equals ba.BaseId 
    join c in db.Clients on ba.ClientId equals c.ClientId 
    select new BaseDTO 
    { 
     BaseName = nb.FirstOrDefault().BaseName, 
     BaseStart = nb.FirstOrDefault().BaseStart, 
     BaseEnd = nb.FirstOrDefault().BaseEnd, 
     Clients = new ClientDTO 
     { 
      ClientId = c.ClientId, 
      CompanyName = c.CompanyName, 
      Owner = c.Owner 
     } 
    }; 
return query; 

这使得该API产生一个JSON,但它仍然只包含一个对象为每个客户,而不是每个基地。

回答

2

你不应该为此手工编组或加入任何东西,只需使用子选择并使LINQ进行繁重的工作。

from b in db.Bases 
select new BaseDTO 
{ 
    BaseName = b.BaseName, 
    BaseStart = b.BaseStart, 
    BaseEnd = b.BaseEnd, 
    Clients = 
     from ba in b.BaseAssignments 
     from c in ba.Client 
     select new ClientDTO 
     { 
      ClientId = c.ClientId, 
      CompanyName = c.CompanyName, 
      Owner = c.Owner 
     } 
} 
+0

谢谢,不知道那一个。不过,我不得不将BaseAssignments中的导航属性从客户端更改为IQueryable ,现在产品JSON的“客户端”对象为空。 –

0

基于StriplingWarrior's建议,混合两全其美到:

from b in db.Bases 
select new BaseDTO 
{ 
    BaseName = b.BaseName, 
    BaseStart = b.BaseStart, 
    BaseEnd = b.BaseEnd, 
    Clients = 
     from ba in b.BaseAssignments 
     join c in db.Clients on ba.ClientId equals c.ClientId 
     select new ClientDTO 
     { 
      ClientId = c.ClientId, 
      CompanyName = c.CompanyName, 
      Owner = c.Owner 
     } 
}; 

得到了我想要的JSON - 谢谢。