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日

原文地址:https://www.cnblogs.com/HelloZyjS/p/14874445.html