DataTable 转Json的一种情况怎么办

摇撼大地 2016-08-29 05:02:35
DataTable结构是这样的,他是两个表left Join得到的。结构如下

DataTable1:
ThemeID ,UserName , CreateDate
DataTable2:
ThemeID , Comment ,CreateDate
他们是一对多的关系。(很多无用的列。没加进来,用ThemeID连接)
直接LeftJoin生成的是一个表。但是直接转Json就有很多重复的数据。就是DataTable1的信息。
我想生成

[
{
ThemeID:"themeID",
UserName:"username",
CreateDate:"createDate",
Comment:
[
{Comment:"comment",
CreateDate:"createDate"},
{Comment:"comment",
CreateDate:"createDate"},
]
},
{
ThemeID:"themeID",
UserName:"username",
CreateDate:"createDate",
Comment:
[
{Comment:"comment",
CreateDate:"createDate"},
{Comment:"comment",
CreateDate:"createDate"},
]
},

]



用C#的话。已经可以得到Dataset。就是leftjoin之后的数据集。
用什么方法才能比较方便的得到下面需要的格式呢?
我用匿名对象,和dynamic都试了一下。发现代码挺多的。逻辑也很混乱。
...全文
208 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
摇撼大地 2016-08-29
  • 打赏
  • 举报
回复
其实还有一列,是点赞数目,是另外一个点赞表格Count出来的。
摇撼大地 2016-08-29
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
例如说,vs 产生了代码
[public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string ThemeID { get; set; }
    public string UserName { get; set; }
    public string CreateDate { get; set; }
    public Comment[] Comment { get; set; }
}

public class Comment
{
    public string Comment { get; set; }
    public string CreateDate { get; set; }
}
你可以以此方便地做修改,例如修改数组为 List<>,等等。 但是最重要地是,这个设计的起点是从需求的数据实体 Model 出发的,不是从什么数据表、DataTable、LeftJoin 之类的词儿出发的。 你纠结的一大堆东西其实都是在帖子里边就很明显是自相矛盾的。那么一点点代码设计,就绕不出来了,原因就在于你设计实体模型时还是不能从高级的需求结构出发,总是从最低级的那些技术出发。
这个就是我设计的模型啊。但是,我页面不需要那么多条的数据,比如我comment里面数据是6列。Class1里面数据是8列。我只用其中的5列。所以sql语句没有提取那么多数据。但是最后转换的时候。之前的模型类也不能用啊,而且里面还有另外一个表的一个统计点赞数目的数据。 我就是想,如何把一个一对多表格查询出来的结果做成那种json格式。 或者说,有没有办法把一对多表格用更好的sql查询,和更灵活的方法做成json的格式。
  • 打赏
  • 举报
回复
例如说,vs 产生了代码
[public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string ThemeID { get; set; }
    public string UserName { get; set; }
    public string CreateDate { get; set; }
    public Comment[] Comment { get; set; }
}

public class Comment
{
    public string Comment { get; set; }
    public string CreateDate { get; set; }
}
你可以以此方便地做修改,例如修改数组为 List<>,等等。 但是最重要地是,这个设计的起点是从需求的数据实体 Model 出发的,不是从什么数据表、DataTable、LeftJoin 之类的词儿出发的。 你纠结的一大堆东西其实都是在帖子里边就很明显是自相矛盾的。那么一点点代码设计,就绕不出来了,原因就在于你设计实体模型时还是不能从高级的需求结构出发,总是从最低级的那些技术出发。
摇撼大地 2016-08-29
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
既然你关心“有很多重复的数据”,有什么想当然地固守着什么“LeftJoin生成的是一个表"呢? 到底什么才是重要的、才是你设计的出发点呢? 如果你在乎需求的感受(有太多重复的数据,不但浪费、也怕有不一致的值),那么数据结构就应该按照需求来设计。而把数据库表、Left Join暂时忘在脑后,先把作为查询结果的数据 Model 定义出来。
多余的数据,是因为不想用很多sql语句来生成数据,因为这样速度就会慢。所以只用了一条sql语句。 不知道这种情况。是用多条sql语句来得到数据,然后内存中组合成结果好。 还是用一条sql语句然后把结果集转换来的好。
摇撼大地 2016-08-29
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
你把你贴出的“想生成”的 json 内容,用 vs 的“将 JSON 粘贴为类” 看看,查看一下应该如何定义。
这个套路是会的。但是我想问有没有更好的办法。因为这种一对多的表格是很多的,以后可能遇到很多。如果能找到一个好办法,不用生成类型,直接转化的话。会很有用。 我想过匿名类,还有AsEnumberable。觉得都不是很好用。
摇撼大地 2016-08-29
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
既然你关心“有很多重复的数据”,有什么想当然地固守着什么“LeftJoin生成的是一个表"呢? 到底什么才是重要的、才是你设计的出发点呢? 如果你在乎需求的感受(有太多重复的数据,不但浪费、也怕有不一致的值),那么数据结构就应该按照需求来设计。而把数据库表、Left Join暂时忘在脑后,先把作为查询结果的数据 Model 定义出来。
数据库是没有重复的。就是sql语句生成的数据是有重复的。一对多生成的时候。
xiaoqiu_net 2016-08-29
  • 打赏
  • 举报
回复
你要你那种格式的话,要自定义那样的类型结构了。 public class Tab1 { public Tab2 tab2{get;set;} } 遍历datatable再处理。
摇撼大地 2016-08-29
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
只能DataTable再处理成实体集合,否则出不来下面这种格式
Comment:
     [
          Comment:"comment",
          CreateDate:"createDate"
      ]
那就是把数据做成类。然后转成List<Myclass>,这一步省不了么?我尝试用AsEnumberable()生成list。但是AsEnumberable之后。用linq就有点摸不准了。
  • 打赏
  • 举报
回复
你把你贴出的“想生成”的 json 内容,用 vs 的“将 JSON 粘贴为类” 看看,查看一下应该如何定义。
  • 打赏
  • 举报
回复
既然你关心“有很多重复的数据”,有什么想当然地固守着什么“LeftJoin生成的是一个表"呢? 到底什么才是重要的、才是你设计的出发点呢? 如果你在乎需求的感受(有太多重复的数据,不但浪费、也怕有不一致的值),那么数据结构就应该按照需求来设计。而把数据库表、Left Join暂时忘在脑后,先把作为查询结果的数据 Model 定义出来。
  • 打赏
  • 举报
回复
只能DataTable再处理成实体集合,否则出不来下面这种格式
Comment:
     [
          Comment:"comment",
          CreateDate:"createDate"
      ]

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧