开发中经常遇到的几个场景案例的处理方法

开发使用场景一(获取到正确的集合SQL字段):

1: 通常我们需要在后台这样来处理SQL,动态获取id集合 ,这样说大家还不是太明白

这里举一下小例子 例如:
//伪代码

复制代码
1 IDbConnection connection = null;
2 StringBuilder sb = new StringBuilder();
3 var listid = new List<int> { 1, 2, 11, 44, 21, 8, 31, 98 };
4 sb.Append("select a,b,c,d");
5 sb.Append("from taba left join tabb on taba.id=tabb.id");
6 sb.Append(" left join tabc on taba.id=tabc.id");
7 sb.Append(" where taba.id in (id1,id2,id3) ORDER BY taba.cdate");//里面的id格式,
8 var dynamicobj = Dapper.SqlMapper.Query(connection, sb.ToString());
View Code
复制代码

2:这里给出两种方法来处理,当然数据库中也有分割形成这样的格式或者Sqlserver中形成的一个id table,这里主要是讨论程序上的动态实现

2.1:   //方法一:动态拼接生成需要的格式,说白了就是循环遍历
sb.Append(" where taba.id in ("+ listid.GetSqlListIDByArry() + ") ORDER BY taba.cdate");//里面的id格式,

2.2:其扩展方法code为:

复制代码
 1 public static class ExtentionsHelper
 2 {
 3 public static string GetSqlListIDByArry(this List<int> qidlist)
 4 {
 5 if (qidlist == null || qidlist.Count <= 0)
 6 {
 7 throw new Exception("List<string>集合参数数据不可以为空!");
 8 }
 9 StringBuilder sbQuestionIDList = new StringBuilder();
10 qidlist.ToList().ForEach(c => sbQuestionIDList.Append($"'{c}',"));
11 return sbQuestionIDList.ToString().TrimEnd(',');
12 }
13 }
View Code
复制代码

 2.:3: //方法二:Join

//里面的id是int等数字类型,这样的处理就ok了,
sb.Append(" where taba.id in (" + string.Join(",", listid) + ") ORDER BY taba.cdate");

//但是如果id是字符串类型,还需要进一步来处理,listid.Select(c => c):为对象时的筛选 这里为int集合可以直接拿来使用

sb.Append(" where taba.id in " + $"('{string.Join("', '", listid)}')" + " ORDER BY taba.cdate ");


B开发使用场景二:
1:通常我们在做企业级的报表开发是,通常需要使用的并列排序,啥,并列排序?是啥鬼???宝宝有很多问号是吧?下面举一个案例就会茅塞顿开

2:需求简单描述:班级排名:所选课程的每个考试名称所录入的所有学生的成绩进行降序排名,由1排起,以此获得当前帐号成绩的排名;
(注意:若有不同学生的总分相同时,则排名并列相同,且下一分值的学生排名需要根据排名相同的人数进行顺延,
例如第1名1位同学,第2名并列3位同学,则下一分值的学生排名是第5名)“等级”类型不需要显示班级排名;

3:通常这样的处理我们都是直接使用数据库来实现,可以参考个人之前写的笔记 https://www.cnblogs.com/Fengge518/p/13564742.html

复制代码
1 SELECT 
2 S.id,S.score, 
3 (CASE WHEN 
4 @sameScore=S.score THEN @myrow WHEN @sameScore:=S.score THEN @myrow:=@myrow+1 END) AS myrow
5 FROM 
6 (SELECT id,score
7 FROM studentscore
8 ORDER BY score DESC) S,(
9 SELECT @myrow:=0,@sameScore:= NULL)r ;
View Code
复制代码

3.1:在数据库的做法如下:
但是个人觉得啥都要数据库来实现计算的话,
效率较低,数据库的压力也较大,尤其是数据量大,单机数据库的情况下就会更加的明显,如果我们是而先把拿到的数据放到内存中再来
进一步处理自然会效率高很多,也减轻了数据库的压力。

 

  3.2:自定义简单的方法来实现

复制代码
 1  #region 简单的算法
 2             List<decimal> scoreList = new List<decimal> { 88, 90, 60, 75, 46, 90, 60, 60 };
 3             var newlist = scoreList.OrderByDescending(c => c).Distinct().ToList();
 4             var dic = new Dictionary<decimal, int>();
 5             var orderRangeDic = new Dictionary<decimal, int>();
 6             for (int d = 0; d < newlist.Count; d++)
 7             {
 8                 int scoreCount = scoreList.Where(c => c == newlist[d]).Count(); orderRangeDic.Add(newlist[d], scoreCount); dic.Add(newlist[d], (d + 1));
 9             }
10             while (true)
11             {
12                 try
13                 {
14                     Console.WriteLine("请在【88, 90, 60, 75, 46, 90, 60, 60】数据中选择其中一个数字并输出:");
15                     int score = int.Parse(Console.ReadLine()); int scoreOrder = dic[score];//当前分数的排名
16                     int scoreRange = 0;//默认为零比较合适
17                     if (score == newlist.Max())
18                     {
19                         scoreRange = 1;//直接第一名
20                     }
21                     else if (score == newlist.Min())
22                     {
23                         scoreRange = scoreList.Count;//直接最后一名
24                     }
25                     else
26                     {
27                         int totalScoreRange = 0;
28                         for (int a = 0; a < newlist.Count; a++)
29                         {
30                             decimal nowScore = newlist[a];//目前的分数
31                             if (nowScore != score)
32                                 totalScoreRange += orderRangeDic[nowScore];
33                             else
34                                 totalScoreRange += 1; break;
35                         }
36                         scoreRange = totalScoreRange;
37                     }
38                     Console.WriteLine($"{score}的排名是{scoreRange}");
39                 }
40                 catch (Exception ex)
41                 {
42                     Console.WriteLine($"错误,请重新输入!");
43                 }
44                 System.Threading.Thread.Sleep(90);
45             }
46             #endregion
View Code
复制代码

4:在core控制台上测试的效果

 5:先看测试效果截图(分左右测两个报表的数据,这里一起返回了),postman本地查询325ms出结果还是不错的,

 

 

 

6:emmm 我举手,怀疑你根本就没有使用这些方法,那我就截图拿出证据

 

 好了,到此结束,下次我们再见,继续努力!!! 

 

posted @   天天向上518  阅读(369)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示