2015-05-24 70 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 - 謝謝。