C# json分组数据的实体框架

C# json分组数据的实体框架,c#,json,entity-framework,serialization,C#,Json,Entity Framework,Serialization,我有一个名为Client的类,它如下所示: public class Client { [Key, ForeignKey("BaseAssignments")] public int ClientId { get; set; } public string Owner { get; set; } public string CompanyName { get; set; } public virtual ICollection<BaseAssig

我有一个名为Client的类,它如下所示:

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; }
}
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; }
}
其思想是一个客户机可以被分配到多个基地,一个基地可以包含多个客户机

接下来,我将尝试以这样的方式序列化base Entities,即base的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;
其中,基于的TO如下所示:

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

    public IQueryable<ClientDTO> Clients { get; set; }
}
public class ClientDTO
{
    public int ClientId { get; set; }
    public string Owner { get; set; }
    public string CompanyName { get; set; }
}
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;
到目前为止,我收到一个错误,指出ClientDTO是一个意外类型。我能做些什么来解决这个问题,或者我选择的方式完全错了?提前感谢您对此的任何见解

编辑

我对Web Api控制器方法做了一些更改,因此看起来像:

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

    public IQueryable<ClientDTO> Clients { get; set; }
}
public class ClientDTO
{
    public int ClientId { get; set; }
    public string Owner { get; set; }
    public string CompanyName { get; set; }
}
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,但它仍然为每个客户机(而不是每个基本客户机)包含一个对象。

您不必手动分组或连接任何对象,只需使用子选择并使用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
        }
}
根据建议,将两个世界中的最佳组合为:

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-谢谢。

谢谢,我不知道那个。尽管如此,我还是不得不将BaseAssignments中的导航属性从Client更改为IQueryable,现在产品JSON的“Clients”对象为空。