代码改变世界

linq中order by 和group by (含lambda表达式实现)以及综合案例

2022-02-10 09:02  杨新华  阅读(313)  评论(0)    收藏  举报

Linq应用场景

linq的语法通过System.Linq下面的Enumerable类提供支持,也就是说,只要是实现了IEnumerable<T>的对象都可以使用Linq的语法来查询。LINQ定义了大约40个查询操作符,如select、from、in、where、group by 以及order by,通过查看源代码,实际上linq为IEnumerable<TSource>实现了一系列的扩展方法。

Linq实际应用示例

    //// 按设备分组
                //var mainTemp = tempResults.GroupBy(p => new { p.OEMDeviceID })
                //    .Select(p => new { name = p.Key, count = p.Count() });
                //// 按设备、时长分组
                //var detailTemp = tempResults.GroupBy(p => new { p.OEMDeviceID, p.Duration })
                //    .Select(p => new { name = p.Key, count = p.Count() }).ToList
                   
                // 按设备分组
                var devGroups = from T in tempResults
                         group T by new
                         {
                             T.OEMDeviceID
                         } into g
                         select new
                         {
                             g.Key.OEMDeviceID,
                             count = g.Count()
                         };
                // 按设备、时长分组
                var devDurationGroup = from T in tempResults
                         group T by new
                         {
                             T.OEMDeviceID,
                             T.Duration
                         } into g
                         select new
                         {
                             g.Key.OEMDeviceID,
                             g.Key.Duration,
                             count = g.Count()
                         };

 

二、Linq中的关键字

今天这里主要讨论order by 和group by的使用

1.linq order by(多列)

var list= from r in Transactions where r.ZhiFuQuDao== "支付宝" orderby r.HospitalID ,r.Moneys descending select r;

 

2.Lambda表达式 实现 order by(多列)

var list = Transactions. OrderBy(r => r.HospitalID). ThenBy(r => r.Type). ThenByDescending(r => r.Moneys ). Take(10);

3.linq group by(多列)

 

1.简单的实现方式:

var list = from T in Transactions group T by T.ZhiFuQuDao into g select g;

 

语句描述:Linq使用Group By 统计交易流水的支付渠道方式(支付宝或微信等等)。

说明:这里将查询结果 命名为g,一旦重新命名,T 的作用域就结束了,所以,最后select时,只能select g。

 

2.分类统计各个分类的最大值(Max)、最小值(Min)、平均值(Average)和求和(Sum)

var q = from T in Transactions group T by T.ZhiFuQuDao into g select new { g.Key, MaxPrice = g.Max(T => T.Moneys) };

 

语句描述:Linq使用Group By和Max查找交易流水每种支付渠道的最高金额的一笔交易。

说明:先按ZhiFuQuDao进行分类,然后获取每个分类的最高一笔交易金额赋给MaxPrice。最小值、平均值和求和实现和此类似,替换关键之即可

 

3.多列(Multiple Columns)

var dateQDList = from T in hisDZD group T by new { T.JiaoYiRQ, T.JiaoYiQDMC } into g select new { g.Key.JiaoYiRQ, g.Key.JiaoYiQDMC };
 

语句描述:Linq使用Group By按交易日期和交易渠名称将his对账单进行分组统计。

效果图如下

 

4. lambda group by(多列带表达式)

var dateQDList = hisDZD.GroupBy(t => new
{
JiaoYiRQ=Convert.ToDateTime(t.JiaoYiRQ).ToString("yyyy-MM-dd"),
t.JiaoYiQDMC
}) .Select(g=>new {
JiaoYiRQ = Convert.ToDateTime(g.Key.JiaoYiRQ).ToString("yyyy-MM-dd"),
JiaoYiQDMC = g.Key.JiaoYiQDMC
}).ToList();

语句描述:Linq使用Group By按交易日期和交易渠名称将his对账单进行分组统计。

效果:同上

说了这么多不知道大家有没有理解和使用呢

最后留两道题给大家,看大家是否能学以致用

1:给“cdabe” 排序;

2:给"ABCCD,CDA,BCDD,DCA,ADC,BCD,CDCAB"将含有相同字母的进行分组并排序。

 
 

    //// 按设备分组                //var mainTemp = tempResults.GroupBy(p => new { p.OEMDeviceID })                //    .Select(p => new { name = p.Key, count = p.Count() });                //// 按设备、时长分组                //var detailTemp = tempResults.GroupBy(p => new { p.OEMDeviceID, p.Duration })                //    .Select(p => new { name = p.Key, count = p.Count() }).ToList                                   // 按设备分组                var devGroups = from T in tempResults                         group T by new                         {                             T.OEMDeviceID                         } into g                         select new                         {                             g.Key.OEMDeviceID,                             count = g.Count()                         };                // 按设备、时长分组                var devDurationGroup = from T in tempResults                         group T by new                         {                             T.OEMDeviceID,                             T.Duration                         } into g                         select new                         {                             g.Key.OEMDeviceID,                             g.Key.Duration,                             count = g.Count()                         };