我通过两张表里查询出这样的json数据,用linq请问怎么写?

ruan1978 2018-10-15 01:11:25
需要获取的数据这样:
{"name":"张三",
"sex":"男",
"age":18,
"grade":
{"gname":"三年八班",
"gdesc":"初三年级八班"
}
}

第一张表的学生(student)基本信息:
id no name,sex,age,
第二张表的年级(studentgrade)信息:
id gname gdesc
两张表通过id关联,这两张表一对多的关系,student表一条记录,对应这个学生年级表有两条记录。
返回的数据定义了一个类,定义的类如下:
public class Stud
{
public int id{get;set;}
public string no {get;set;}
public string sex{get;set;}
public int age{get;set;}
public StudGrade grade{get;set;}
}
public class StudGrade
{
public int id{get;set;}
public string gname{get;set;}
public string gdesc{get;set;}
}
我在具体查询的函数里:
public class ...Repository : ...Repository, IDisposable
{
public List<Stud> GetStudentByNo(string strNo)
{
using (AppDBEntities db = new AppDBEntities())
{
var results =
(
from ds in db.student
from dsq in db.studentgrade
where ds.no == strNo
where dsq.id== ds.id
select new Stud{ Id = ds.Id, no = ds.no , sex= ds.sex,grade.gname=dsq.gname, grade.gdesc= dsq.gdesc}
).Distinct().ToList();
return results;
}
}

这样返回来是两条记录形式,能否在这个函数里,做个处理,一对多表,希望以一条记录形式返回来,以json方式返回如下:
{"name":"张三",
"sex":"男",
"age":18,
"grade":
{"gname":"三年八班",
"gdesc":"初三年级八班"
}
}
...全文
868 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruan1978 2018-10-17
  • 打赏
  • 举报
回复
引用 25 楼 God_Girl 的回复:
简单啊!你先查出来两条记录丢到list里面再循环就可以了嘛! 放到list里面总会处理了撒?
如果前面查询出来是一个model类型,现在新生成一个是匿名类型,是否需要转换,否则我返回类型出现如下错误: 错误 1 无法将类型“System.Collections.Generic.IEnumerable<AnonymousType#3>”隐式转换为“System.Collections.Generic.List<RH.APPPlatform.Models.WEBAPI.HospitalPackageMasterQueryModel>”。存在一个显式转换(是否缺少强制转换?) public List<HospitalPackageMasterQueryModel> GetPackageMasterInfoById(string strId) { using (AppDBEntities db = new AppDBEntities()) { var results = ( from ds in db.Welcome_HospitalPackageMaster from dsq in db.Welcome_HospitalPackageMasterPicture where ds.InHospital == strId where ds.Id == dsq.ID select new HospitalPackageMasterQueryModel { Id = ds.Id, Name = ds.Name, Fees = ds.Fees.Value, Property = ds.Property, InHospital = ds.InHospital, IntendFor = ds.IntendFor, IconPath = dsq.IconPath, Feature = dsq.Feature , Memo = ds.Memo }).ToList(); var q = results.GroupBy(x => new { x.Id, x.Name,x.Fees,x.Property,x.InHospital,x.IntendFor,x.IntendForSex,x.Memo}).Select(x => new { Id = x.Key.Id, Name = x.Key.Name, Fees = x.Key.Fees, Property=x.Key.Property, InHospital=x.Key.InHospital, IntendFor=x.Key.IntendFor, IntendForSex=x.Key.IntendForSex, Memo=x.Key.Memo, IconPath = string.Join(",", x.Select(y => y.IconPath)), Feature = string.Join(",",x.Select(y=>y.Feature)) }); return (HospitalPackageMasterQueryModel)q;
ruan1978 2018-10-17
  • 打赏
  • 举报
回复
引用 23 楼 hanjun0612 的回复:
[quote=引用 22 楼 ruan1978 的回复:] [quote=引用 20 楼 hanjun0612 的回复:] 你本来就是分组查询的,返回类型当然不一致。 我建议你应该先学习一下linq
我想得到的是查询主表一条记录,因为主表对应细表可能有两条或者三条记录,我也明白,做连接查询,肯定细表几条记录,主表同样会出现几条记录,所以主要是如何处理? 查询出来这样的结果: No Name Age address(city province) 1 张三 16 广州 广东 1 张三 16 南京 江苏 变成: No Name Age address 1 张三 16 (广州 广东、南京 江苏) [/quote] 给你写了例子,你自己改改吧 [/quote] 谢谢大师指点,我把查询的结果做个处理。
  • 打赏
  • 举报
回复
简单啊!你先查出来两条记录丢到list里面再循环就可以了嘛!
放到list里面总会处理了撒?
ruan1978 2018-10-17
  • 打赏
  • 举报
回复
引用 23 楼 hanjun0612 的回复:
[quote=引用 22 楼 ruan1978 的回复:] [quote=引用 20 楼 hanjun0612 的回复:] 你本来就是分组查询的,返回类型当然不一致。 我建议你应该先学习一下linq
我想得到的是查询主表一条记录,因为主表对应细表可能有两条或者三条记录,我也明白,做连接查询,肯定细表几条记录,主表同样会出现几条记录,所以主要是如何处理? 查询出来这样的结果: No Name Age address(city province) 1 张三 16 广州 广东 1 张三 16 南京 江苏 变成: No Name Age address 1 张三 16 (广州 广东、南京 江苏) [/quote] 给你写了例子,你自己改改吧 [/quote] 您误解我意思了。我的意思不是两条记录,主表一个人的信息可能对应他有两个地址,表示的时候应该是一条完整的信息,只不过地址是子想想么。
正怒月神 版主 2018-10-17
  • 打赏
  • 举报
回复
引用 22 楼 ruan1978 的回复:
[quote=引用 20 楼 hanjun0612 的回复:] 你本来就是分组查询的,返回类型当然不一致。 我建议你应该先学习一下linq
我想得到的是查询主表一条记录,因为主表对应细表可能有两条或者三条记录,我也明白,做连接查询,肯定细表几条记录,主表同样会出现几条记录,所以主要是如何处理? 查询出来这样的结果: No Name Age address(city province) 1 张三 16 广州 广东 1 张三 16 南京 江苏 变成: No Name Age address 1 张三 16 (广州 广东、南京 江苏) [/quote] 给你写了例子,你自己改改吧
ruan1978 2018-10-17
  • 打赏
  • 举报
回复
引用 20 楼 hanjun0612 的回复:
你本来就是分组查询的,返回类型当然不一致。
我建议你应该先学习一下linq

我想得到的是查询主表一条记录,因为主表对应细表可能有两条或者三条记录,我也明白,做连接查询,肯定细表几条记录,主表同样会出现几条记录,所以主要是如何处理?
查询出来这样的结果:
No Name Age address(city province)
1 张三 16 广州 广东
1 张三 16 南京 江苏
变成:
No Name Age address
1 张三 16 (广州 广东、南京 江苏)

weixin_43439527 2018-10-17
  • 打赏
  • 举报
回复
你不需要join了,你的student已经外关联grade了
正怒月神 版主 2018-10-17
  • 打赏
  • 举报
回复
你本来就是分组查询的,返回类型当然不一致。 我建议你应该先学习一下linq
ruan1978 2018-10-17
  • 打赏
  • 举报
回复
引用 16 楼 hanjun0612 的回复:
至于你说的where条件和id相等条件,
var q = (from a in list
join b in list1 on a.ID equals b.ID
where 你的no相等
group new{a,b} by a.Name into g
select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } });


返回类型不一致了!
ruan1978 2018-10-16
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
你不需要join了,你的student已经外关联grade了


外关联?什么意思?
ruan1978 2018-10-16
  • 打赏
  • 举报
回复
引用 9 楼 hanjun0612 的回复:
[quote=引用 7 楼 ruan1978 的回复:]
[quote=引用 4 楼 hanjun0612 的回复:]
如果实体关联设计了,可以使用楼上的
否则 只能自己join后 在group查询了,大概如下 我没测试过。你试试看,更换一下字段

var q = (from a in list
join b in list1 on a.ID equals b.ID
group new{a,b} by a.Name into g
select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } });


还是两条记录,而且获取不到。
public class ...Repository : ...Repository, IDisposable
{
public List<Stud> GetStudentByNo(string strNo)
{
using (AppDBEntities db = new AppDBEntities())
{
var results =
(
from ds in db.student
from dsq in db.studentgrade
where ds.no == strNo
where dsq.id== ds.id
select new Stud{ Id = ds.Id, no = ds.no , sex= ds.sex,grade= new StudGrade{gname=dsq.gname,gdesc= dsq.gdesc}}
).Distinct().ToList();
return results;
}
}
这样查询还是两条记录,而且gname和gdesc为空.[/quote]
你看一下我上面给的语句,照着改改就好了。
你自己写的语句,和我给的不一样。[/quote]

那传进来得那个参数不需要写到条件里去吗? where ds.no == strNo 这个怎么办?
正怒月神 版主 2018-10-16
  • 打赏
  • 举报
回复
引用 7 楼 ruan1978 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 如果实体关联设计了,可以使用楼上的 否则 只能自己join后 在group查询了,大概如下 我没测试过。你试试看,更换一下字段

var q = (from a in list
                     join b in list1 on a.ID equals b.ID
                     group new{a,b} by a.Name into g
                     select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } });
还是两条记录,而且获取不到。 public class ...Repository : ...Repository, IDisposable { public List<Stud> GetStudentByNo(string strNo) { using (AppDBEntities db = new AppDBEntities()) { var results = ( from ds in db.student from dsq in db.studentgrade where ds.no == strNo where dsq.id== ds.id select new Stud{ Id = ds.Id, no = ds.no , sex= ds.sex,grade= new StudGrade{gname=dsq.gname,gdesc= dsq.gdesc}} ).Distinct().ToList(); return results; } } 这样查询还是两条记录,而且gname和gdesc为空.[/quote] 你看一下我上面给的语句,照着改改就好了。 你自己写的语句,和我给的不一样。
  • 打赏
  • 举报
回复
你不需要join了,你的student已经外关联grade了
ruan1978 2018-10-16
  • 打赏
  • 举报
回复
引用 15 楼 hanjun0612 的回复:
首先,你要先确定你使用的是ef db first, 只有ef first,可以在不添加关联属性时,会关联外键集合。 如果你使用的不是 db first 通过数据库生成的edmx文件。 那么你就要添加特性来标记model的关联项。 否则的话,你就只能join。
我用的是db first,如果完整的这样,你看看如何改?我按照你的改乱了。 public List<HospitalPackageMasterQueryModel> GetPackageMasterInfoById(string strId) { using (AppDBEntities db = new AppDBEntities()) { var results = ( from ds in db.Welcome_HospitalPackageMaster from dsq in db.Welcome_HospitalPackageMasterPicture where ds.InHospital == strId select new HospitalPackageMasterQueryModel { Id = ds.Id, Name = ds.Name, Fees = ds.Fees.Value, Property = ds.Property, InHospital = ds.InHospital, IntendFor = ds.IntendFor, IntendForSex = ds.IntendForSex, IconPath = dsq.IconPath, Feature = dsq.Feature , Memo = ds.Memo } ).Distinct().ToList(); return results; } } public class HospitalPackageMasterQueryModel { [Display(Name = "Id")] public string Id { get; set; } [Display(Name = "Name")] public string Name { get; set; } [Display(Name = "Fees")] public decimal Fees { get; set; } [Display(Name = "Property")] public string Property {get; set; } [Display(Name = "InHospital")] public string InHospital { get; set; } [Display(Name = "IntendFor")] public string IntendFor { get; set; } public HospitalPackageMasterPicture attach { get; set; } [Display(Name = "IntendForSex")] public string IntendForSex { get; set; } [Display(Name = "IconPath")] public string IconPath { get; set; } [Display(Name = "Feature")] public string Feature { get; set; } [Display(Name = "Memo")] public string Memo { get; set; } } public class HospitalPackageMasterPicture { [Display(Name = "NID")] public int NID { get; set; } [Display(Name = "ID")] public string ID { get; set; } [Display(Name = "IconPath")] public string IconPath { get; set; } [Display(Name = "Feature")] public string Feature { get; set; } }
正怒月神 版主 2018-10-16
  • 打赏
  • 举报
回复
至于你说的where条件和id相等条件, var q = (from a in list join b in list1 on a.ID equals b.ID where 你的no相等 group new{a,b} by a.Name into g select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } });
正怒月神 版主 2018-10-16
  • 打赏
  • 举报
回复
首先,你要先确定你使用的是ef db first, 只有ef first,可以在不添加关联属性时,会关联外键集合。 如果你使用的不是 db first 通过数据库生成的edmx文件。 那么你就要添加特性来标记model的关联项。 否则的话,你就只能join。
ruan1978 2018-10-16
  • 打赏
  • 举报
回复
条件里不用写两个id判断相等了?

引用 13 楼 starfd 的回复:
public class Stud
{
public int id{get;set;}
public string no {get;set;}
public string sex{get;set;}
public int age{get;set;}
public StudGrade grade{get;set;}
}
public class StudGrade
{
public int id{get;set;}
public string gname{get;set;}
public string gdesc{get;set;}
}

你的Student不是已经与StudGrade有外键关联了,可以直接通过grade来获取

条件里不用写两个id判断相等了?
  • 打赏
  • 举报
回复
public class Stud { public int id{get;set;} public string no {get;set;} public string sex{get;set;} public int age{get;set;} public StudGrade grade{get;set;} } public class StudGrade { public int id{get;set;} public string gname{get;set;} public string gdesc{get;set;} } 你的Student不是已经与StudGrade有外键关联了,可以直接通过grade来获取
ruan1978 2018-10-16
  • 打赏
  • 举报
回复
引用 9 楼 hanjun0612 的回复:
[quote=引用 7 楼 ruan1978 的回复:] [quote=引用 4 楼 hanjun0612 的回复:] 如果实体关联设计了,可以使用楼上的 否则 只能自己join后 在group查询了,大概如下 我没测试过。你试试看,更换一下字段

var q = (from a in list
                     join b in list1 on a.ID equals b.ID
                     group new{a,b} by a.Name into g
                     select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } });
还是两条记录,而且获取不到。 public class ...Repository : ...Repository, IDisposable { public List<Stud> GetStudentByNo(string strNo) { using (AppDBEntities db = new AppDBEntities()) { var results = ( from ds in db.student from dsq in db.studentgrade where ds.no == strNo where dsq.id== ds.id select new Stud{ Id = ds.Id, no = ds.no , sex= ds.sex,grade= new StudGrade{gname=dsq.gname,gdesc= dsq.gdesc}} ).Distinct().ToList(); return results; } } 这样查询还是两条记录,而且gname和gdesc为空.[/quote] 你看一下我上面给的语句,照着改改就好了。 你自己写的语句,和我给的不一样。[/quote] var q = (from a in list join b in list1 on a.ID equals b.ID group new{a,b} by a.Name into g select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } }); group new {a,b}带红色波浪线
ruan1978 2018-10-15
  • 打赏
  • 举报
回复
引用 4 楼 hanjun0612 的回复:
如果实体关联设计了,可以使用楼上的 否则 只能自己join后 在group查询了,大概如下 我没测试过。你试试看,更换一下字段

var q = (from a in list
                     join b in list1 on a.ID equals b.ID
                     group new{a,b} by a.Name into g
                     select new { name = g.Key, grade = new {gid = g.Select(y=>y.a.ID),gname=g.Select(y=>y.b.gName) } });
还是两条记录,而且获取不到。 public class ...Repository : ...Repository, IDisposable { public List<Stud> GetStudentByNo(string strNo) { using (AppDBEntities db = new AppDBEntities()) { var results = ( from ds in db.student from dsq in db.studentgrade where ds.no == strNo where dsq.id== ds.id select new Stud{ Id = ds.Id, no = ds.no , sex= ds.sex,grade= new StudGrade{gname=dsq.gname,gdesc= dsq.gdesc}} ).Distinct().ToList(); return results; } } 这样查询还是两条记录,而且gname和gdesc为空.
加载更多回复(6)

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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