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日

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/14874445.html
Copyright © 2011-2022 走看看