分组循环查询实现列转行

开发工具与关键技术: VisualStudio 2015   mvc
作者:杨泽平
撰写时间:2019、7、22

在做项目的过程中遇到过这样一个问题,我需要把数据库一张表的多条费用数据查出来,并且让他在一行显示,多条费用是指不同的费用,而我这个数据库表只有一个字段来储存这些费用,(这个字段储存的是外键,多种费用是固定在另一张表里,新增的时候只需要把外键新增到那个字段里),两个数据库表如下图所示:

1、固定费用表

分组循环查询实现列转行_第1张图片

2、需要查询的表

在这里插入图片描述

我要查询这张表里的这个人的多条费用,并让其在一行显示,如果按最普通的思路去写查询,也就是查外键这张表连查固定的这张表,就可以查出他的多条费用数据,虽然可以查出他的多条费用,但是查出来的结果集并不是一条,而是这个人他有多少条费用数据,就会显示多少条数据。

如下图所示:

分组循环查询实现列转行_第2张图片

很显然,按普通的查询思路去做,是达不到我需要的要求,换一种思路去想,我们查询的那张表里一个人有多条费用,他里面有那个人的外键,我们可以通过查询那个人的外键,对他进行进行分组,因为那张表里不只他一个人的费用,他存在多个人的多条费用数据,所以根据对应的人进行分组,分组后再进行循环,通过循环的方式把每组里的费用添加到新new的实体里,输出的时候就输出新new的实体,这样就可以达到一条显示的效果了。也就是普通的查询思路查出来的数据是一列显示,分组查询再循环的方法查询出来的结果是一行显示,也就是列转行。

详情代码如下:

List
listChargeCheckin = new List();

//查询所有费用数据,根据长者ID进行分组

var list = (from tbCost in myModels.B_Cost

        select new ChargeDetailVo

        {

            ElderID = tbCost.ElderID

        }).Distinct().ToList();

//循环

for (int i = 0; i <
list.Count(); i++)

{

int? id = list[i].ElderID;

var list2 = (from tbCheckin in myModels.B_Checkin

             join tbElder in myModels.B_Elder on tbCheckin.ElderID equals tbElder.ElderID

             join tbCost in myModels.B_Cost on tbElder.ElderID equals tbCost.ElderID

             join tbCostDetail in myModels.B_CostDetail on tbCost.CostDetailID equals tbCostDetail.CostDetailID

             join tbUser in myModels.S_User on tbElder.UserID equals tbUser.UserID

             where tbCost.ElderID == id

             select new ChargeDetailVo

             {

                 ElderID = tbElder.ElderID,//长者ID

                 CheckinNumber =
tbCheckin.CheckinNumber,//入住号

                 ElderName =
tbElder.ElderName,//长者姓名

                 CostDetail2 = tbCostDetail.CostDetail,//费用

                 EnterSite =
tbUser.EnterSite,//区域

                 CheckinTime =
tbCheckin.CheckinTime,//时间

             }).ToList();

ChargeDetailVo listChargeCheckin1 = new ChargeDetailVo();



listChargeCheckin1.ElderID =
list2[0].ElderID;

listChargeCheckin1.ElderName =
list2[0].ElderName;

listChargeCheckin1.EnterSite =
list2[0].EnterSite;

listChargeCheckin1.CheckinTime =
list2[0].CheckinTime;

listChargeCheckin1.CostDetail2 =
list2[1].CostDetail2;

listChargeCheckin1.CostDetail4 =
list2[3].CostDetail2;

listChargeCheckin1.CostDetail3 =
list2[2].CostDetail2;

listChargeCheckin1.CostDetail5 =
list2[4].CostDetail2;

listChargeCheckin1.CostDetail9 =
list2[5].CostDetail2;

listChargeCheckin1.CostDetail1 =
list2[0].CostDetail2;

//将循环的结果添加到实体

listChargeCheckin.Add(listChargeCheckin1);

}

最后,就是效果了,从下面的图片对比上面普通的思路查询法结果,可以看出上面的查法结果有36条数据,每个人有6条数据,下面的结果,只有6条,每个人只有一条数据。

如图所示:

分组循环查询实现列转行_第3张图片

你可能感兴趣的:(c#)