zoukankan      html  css  js  c++  java
  • System.Linq.Dynamic.Core

    System.Linq.Dynamic.Core

    情景举例: 当我们从数据库中,将一个列表中的数据读取到List中之后,我们可能有对它进行分组的需求, 由于业务原因,或者表设计的原因, 数据源可能来自不同的地方, 那么我们很难通过sql语法一次性在数据库中完成group by的操作,所以我们需要在内存中对数据进行分组,如果分组的需求是明确的那么我们很容易通过C#通过的GroupBy方法,来完成这样的业务,业务实现代码如下:


    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace Demo
    {
        public class Program
        {
            /// <summary>
            /// 数据源实体类
            /// </summary>
            public class ClassInfo
            {
                public int ClassId { get; set; }
                public int ClassLevel { get; set; }
                public int ClassGrade { get; set; }
                public string ClassName { get; set; }
            }
    
            /// <summary>
            /// 数据
            /// </summary>
            public static List<ClassInfo> classInfoList = new List<ClassInfo>
            {
                new ClassInfo {ClassId = 1, ClassLevel = 1,ClassGrade = 2, ClassName = "计算机应用1班"},
                new ClassInfo {ClassId = 2, ClassLevel = 2,ClassGrade = 2, ClassName = "计算机应用2班"},
                new ClassInfo {ClassId = 3, ClassLevel = 1,ClassGrade = 1, ClassName = "计算机应用3班"},
                new ClassInfo {ClassId = 4, ClassLevel = 2,ClassGrade = 2, ClassName = "计算机软件1班"},
                new ClassInfo {ClassId = 5, ClassLevel = 1,ClassGrade = 2, ClassName = "计算机软件2班"},
                new ClassInfo {ClassId = 6, ClassLevel = 2,ClassGrade = 1, ClassName = "计算机软件3班"},
            };
    
            static void Main(string[] args)
            {
                //明确知道分组条件方式
                var groupBy = classInfoList.GroupBy(x => new { x.ClassLevel, x.ClassGrade }).ToList();
    
                foreach (var item in groupBy)
                {
                    Console.WriteLine($"key: => 等级:{item.Key.ClassLevel},班级:{item.Key.ClassGrade}");
    
                    foreach (var curKey in item)
                    {
                        Console.WriteLine($"{curKey.ClassId}{curKey.ClassLevel}{curKey.ClassGrade}{curKey.ClassName}");
                    }
                }
                Console.ReadKey();
            }
    
        }
    }
    
    

    运行结果:

    运行结果
    运行结果

    上面的例子中, 我们明确知道我们需要以ClassLevel以及ClassGrade 两个字段进行分组,所以我们可以通过C#提供的GroupBy方法优雅的实现这一需求,但是如果分组条件是不明确的呢? 比如我们的前端可能需要通过勾选分组条件字段的的方式来确认分组实现, 那么我们如何做呢? 这个时候我们就可以借助System.Linq.Dynamic.Core提供的扩展,来达到这一目的,首先我们需要先通过Nuget安装System.Linq.Dynamic.Core,实现代码如下:

    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Dynamic.Core;
    
    namespace Demo
    {
        public class Program
        {
            /// <summary>
            /// 数据源实体类
            /// </summary>
            public class ClassInfo
            {
                public int ClassId { get; set; }
                public int ClassLevel { get; set; }
                public int ClassGrade { get; set; }
                public string ClassName { get; set; }
            }
    
            /// <summary>
            /// 数据
            /// </summary>
            public static List<ClassInfo> classInfoList = new List<ClassInfo>
            {
                new ClassInfo {ClassId = 1, ClassLevel = 1,ClassGrade = 2, ClassName = "计算机应用1班"},
                new ClassInfo {ClassId = 2, ClassLevel = 2,ClassGrade = 2, ClassName = "计算机应用2班"},
                new ClassInfo {ClassId = 3, ClassLevel = 1,ClassGrade = 1, ClassName = "计算机应用3班"},
                new ClassInfo {ClassId = 4, ClassLevel = 2,ClassGrade = 2, ClassName = "计算机软件1班"},
                new ClassInfo {ClassId = 5, ClassLevel = 1,ClassGrade = 2, ClassName = "计算机软件2班"},
                new ClassInfo {ClassId = 6, ClassLevel = 2,ClassGrade = 1, ClassName = "计算机软件3班"},
            };
    
            static void Main(string[] args)
            {
                //拼接分组条件方式
                var groupByStr = " new (ClassLevel,ClassGrade) ";
                var query = classInfoList.AsQueryable().GroupBy(groupByStr).Select(" new (it.Key,it as GroupByValue) ");
                var groupList = query.ToDynamicList();
    
                foreach (var item in groupList)
                {
    
                    Console.WriteLine($"key: => 等级:{item.Key.ClassLevel},班级:{item.Key.ClassGrade}");
    
                    foreach (var curKey in item.GroupByValue)
                    {
                        Console.WriteLine($"{curKey.ClassId}{curKey.ClassLevel}{curKey.ClassGrade}{curKey.ClassName}");
                    }
                }
    
                Console.ReadKey();
            }
    
        }
    }
    
    

    运行结果:

    运行结果
    运行结果

    我们可以通过字符串拼接的方式来对groupBy条件来进行拼接,达到动态拼接分组条件的目的.

    更多System.Linq.Dynamic.Core用法请查看如下地址:

    System.Linq.Dynamic.Core官网
    System.Linq.Dynamic.Core文档

    编辑日期: 2021年6月11日

  • 相关阅读:
    mysql高可用架构的构想
    shell进阶——expect免交互工具的使用
    Mysql性能优化之参数配置(转)
    mysql主从同步问题梳理
    使用mysql-proxy实现mysql的读写分离
    Mysql数据库的主从与主主
    Mariadb远程登陆配置及相关问题排查
    redis集群搭建及常用操作
    weblogic的linux静默搭建
    Python traceback 模块,追踪错误
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/14874445.html
Copyright © 2011-2022 走看看