一、业务需求
list中存放的数据结构:
id | 姓名 | 期数 | 截图地址 |
---|---|---|---|
01 | 张三 | 14期 | Picture01 |
01 | 张三 | 14期 | Picture02 |
01 | 张三 | 14期 | Picture03 |
02 | 李四 | 14期 | Picture04 |
02 | 李四 | 14期 | Picture05 |
03 | 王二麻子 | 14期 | Picture06 |
03 | 王 二麻子 | 14期 | Picture07 |
要将上述的数据存储结构转成下面的数据结构
id | 姓名 | 期数 | 截图地址 |
---|---|---|---|
01 | 张三 | 14期 | Picture01 Picture02 Picture03 |
02 | 李四 | 14期 | Picture04 Picture05 |
03 | 王二麻子 | 14期 | Picture06 Picture07 |
实现方式一:多次请求数据库完成
实现思路: 第一次查询出 id 期数 姓名,然后根据`id查询出对应的截图地址,此过程需要遍历,然后将所有的截图信息存入到list中,最后的结构就是下图:
id | 姓名 | 期数 | 截图地址 |
---|---|---|---|
01 | 张三 | 14期 | list |
02 | 李四 | 14期 | list |
03 | 王二麻子 | 14期 | list |
对应的部分代码,不全,但是核心的思想通过注释都显示出来了,不明白可以私聊我
List<ContractInfoDTO> cd = contract.GetAllContracInformationByDifferentParameter(page, limit, userName, organizaName);
//此时cd里面存的是所有没有经过合并的数据
for (int i = 0; i < cd.Count; i++)
{
cd[i].PictureUrl = new List<string>();
List<ScreenDTO> listScreen = contract.getScreenPictureByidAndYear(cd[i].Id, cd[i].Contract_Year.ToString());
//listScreen存的是根据年份和id查找的截图,每个id和截图都对应多条记录
for (int j = 0; j < listScreen.Count; j++)
//这个for循环将所有的相对应的截图存放到PictureUrl,这是一个list
{
cd[i].PictureUrl.Add(listScreen[j].Contract_Url);
}
}
return cd;
ContractInfoDTO里面的代码:
public List<string> PictureUrl { get; set; }
public string user_name { get; set; }
public string Id { get; set; }
public string organization { get; set; }
swagger中显示的pictureurl
上述有缺点,因为多次请求数据库,这样十分不好,也是李总要求优化的地方 ,下面的方式二就是优化后的
实现方式二 只请求一次数据库
实现思路:第一次查询出了未经过合并的所有的数据,对现在的数据进行操作, 利用字典, 循环遍历list,然后判断如果有重复的id,就对截图地址进行拼接, 采用的方式是使用字典,如下代码:
List<ContractInfoDTO> list = contract.GetAllContracInformationByDifferentParameter(page, limit, userName, organizaName);
//此时list里面存的是所有没有经过合并的数据
List<ContractInfoDTO> listLog = new List<ContractInfoDTO>();
Dictionary<string, string> dic = new Dictionary<string, string>();
//遍历list
list.ForEach(res =>
{
//如果一开始字典中没有数据,或者没有重复的id,就在listLog增加相应的记录
if (dic.Count==0?true:!dic.ContainsKey(res.Id))
{
dic.Add(res.Id, res.sc_contract_copy_url);
listLog.Add(res);
}
else
{
dic[res.Id] = dic[res.Id] + "," + res.sc_contract_copy_url;
listLog.FirstOrDefault(x => x.Id == res.Id).sc_contract_copy_url = dic[res.Id];
}
});
return listLog;
下图是swagger中的数据,此时在前端通过截取就可以获得单个截图地址了