【问题标题】:Entity Framework to json - grouping data实体框架到 json - 分组数据
【发布时间】:2015-08-06 09:50:28
【问题描述】:

我有一个名为 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; }
}

还有一个名为 Base 的类,如下所示:

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 是一种意外类型。我能做些什么来解决这个问题,或者我选择的方式可能是完全错误的?提前感谢您对此的任何见解。

编辑

我对 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 = new ClientDTO
        {
            ClientId = c.ClientId,
            CompanyName = c.CompanyName,
            Owner = c.Owner
        }
    };
return query;

这使得 Api 生成一个 JSON,但它仍然包含每个客户端的单个对象,而不是每个基。

【问题讨论】:

    标签: c# json entity-framework serialization


    【解决方案1】:

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

    【讨论】:

      【解决方案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
              }
      }
      

      【讨论】:

      • 谢谢,不知道那个。不过,我不得不将 BaseAssignments 中的导航属性从 Client 更改为 IQueryable,现在产品 JSON 的“Clients”对象为空。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多