ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

System.Linq.Dynamic.Core

2021-06-11 11:32:36  阅读:238  来源: 互联网

标签:ClassLevel Core ClassInfo Dynamic System ClassId ClassName new ClassGrade


System.Linq.Dynamic.Core

.NetLinq

情景举例: 当我们从数据库中,将一个列表中的数据读取到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日

标签:ClassLevel,Core,ClassInfo,Dynamic,System,ClassId,ClassName,new,ClassGrade
来源: https://www.cnblogs.com/HelloZyjS/p/14874445.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有