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日