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日

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章