首页 > 编程语言 >C# 构建具有多个字段的 GroupBy 表达式树

C# 构建具有多个字段的 GroupBy 表达式树

时间:2024-04-12 14:55:06浏览次数:27  
标签:City group Name C# Age 字段 var new GroupBy

 

public static Expression<Func<T, object>> GroupByExpression<T>(string[] propertyNames)
{
    var properties = propertyNames.Select(name => typeof(T).GetProperty(name)).ToArray();
    var propertyTypes = properties.Select(p => p.PropertyType).ToArray();
    var tupleTypeDefinition = typeof(Tuple).Assembly.GetType("System.Tuple`" + properties.Length);
    var tupleType = tupleTypeDefinition.MakeGenericType(propertyTypes);
    var constructor = tupleType.GetConstructor(propertyTypes);
    var param = Expression.Parameter(typeof(T), "item");
    var body = Expression.New(constructor, properties.Select(p => Expression.Property(param, p)));
    var expr = Expression.Lambda<Func<T, object>>(body, param);
    return expr;
}
View Code

 

 

 var people = new List<Person>
 {
     new() { Name = "Charlie", Age = 25, City = "Los Angeles" },
     new() { Name = "Alice", Age = 25, City = "New York" },
     new() { Name = "David", Age = 35, City = "Chicago" },
     new() { Name = "Bob", Age = 30, City = "New York" },
     new() { Name = "Eve", Age = 25, City = "New York" }
 };

 // 使用LINQ查询来应用动态排序  
 var orderByFields = new[] { "Name", "Age" }; // 要排序的字段名数组  
 var ascending = new[] { true, false }; // 每个字段的排序方向(升序/降序)数组  

 //多条件排序
 var sortedPeople = people.AsQueryable()
     .OrderByMultipleFields(orderByFields, ascending)
     .ToList();


 // 定义要根据哪些属性进行分组  
 string[] groupByProperties = { "Age", "City" };
 // 构建分组表达式  
 Expression<Func<Person, object>> groupByExpression = DynamicLinqExtensions.GroupByExpression<Person>(groupByProperties);
         
 // 执行分组和求和查询  
 var groups = people
     .GroupBy(groupByExpression.Compile()) // 使用编译后的lambda表达式进行分组  
     //.Select(group => new // 选择每个组的信息  
     //{
     //    Key = group.Key, // 组的键(即多条件组合)  
     //    TotalAmount = group.Sum(item => item.Age) // 组内Amount的和  
     //})
     .ToList(); // 将结果转换为List 

 foreach (var group in groups)
 {
     Console.WriteLine($"Group: {string.Join(", ", group.Key)}");
     foreach (var person in group)
     {
         Console.WriteLine($"  {person.Name}");
     }
 }
View Code

 

 

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}

 

摘自与:c# - 构建具有多个字段的 GroupBy 表达式树 - IT工具网 (coder.work)

标签:City,group,Name,C#,Age,字段,var,new,GroupBy
From: https://www.cnblogs.com/SmilePastaLi/p/18131226

相关文章

  • webpack优化
    编译优化1、使用缓存:缓存可以显著提高编译速度。例如,babel-loader的cacheDirectory选项可以将转译的结果缓存到文件系统中,此外,cache-loader可以将其他loader的处理结果缓存到磁盘。2、DLL动态链接库:DLL文件为动态链接库,在一个动态链接库中可以包含给其他模块调用的函数和数据。......
  • MySQL的CDC数据实时同步
    MySQL的CDC数据实时同步 背景近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台。优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存、更新或者软删除)到一个另一个数据源,持久化之前需要清洗数据并且构建一......
  • VSCode 如何删除无用的语言格式?
    1.情景展示在VisualStudioCode当中,支持很多语言格式。但问题在于,我只是将它当做NotePad++的替代品。当我通过Ctrl+N新建一个文件,并将指定的代码拷贝到VSCode中后,由于默认开启了自动检测语法功能。VSCode总是将java代码识别成Groovy语言,真他妈离谱。如何解决这个问题?2.......
  • 统一controller返回对象
    统一controller返回对象packagecom.xxx.jscaffold.handler;importcom.xxx.jscaffold.api.dto.common.Result;importorg.springframework.core.MethodParameter;importorg.springframework.http.MediaType;importorg.springframework.http.converter.HttpMessageConver......
  • 玩转docker技术
    目录启程容器生态系统docker镜像base镜像镜像的分层结构构建镜像dockercommitdockerfiledockerfile官方文档RUNCMDENTRYPOINT区别分发镜像Docker容器进入容器的方法停止容器删除容器资源限制内存限制CPU限额BlockIO限额实现容器的底层技术cgroupnamespaceDocker网络Brid......
  • count(?)为什么越来越慢?
    在日常的业务开发中,汇总记录使用selectcount(*)fromt是常见用法,分页查询的时候都会用到,那么随着系统记录的数量越来越多,你有没有发现这条语句执行的也越来越慢了呢?一、count(*)原理在不同的存储引擎中,count(*)有不同的实现方式MyISAM存储引擎中,把一个表的总行数存在了磁盘......
  • 【软件】Charles激活码计算器(Go & Java)
    ✨Charleshttps://www.charlesproxy.com/✨在线激活https://www.zzzmode.com/mytools/charles/✨激活码计算器(Go)在线激活的地址中提供了激活码计算器的代码防止在线激活跑路特此保存packagemainimport( "bytes" "encoding/binary" "fmt" "math/rand" "ti......
  • 学习Source Generators之了解Source Generators的应用场景
    前面的文章我们都初步学习了SourceGenerators的使用方式以及做了一些简单的代码生成工具。但是SourceGenerators除了做自动代码生成之外,还能有别的应用场景,本文来了解一下SourceGenerators的应用场景。介绍SourceGenerators(源代码生成器)是.NET生态系统中的一项强大工具,它......
  • 阿里云函数计算 FC牵手通义灵码 ,打造智能编码新体验
    通义灵码自成功入职阿里云后,其智能编程助手的角色除了服务于阿里云内部几万开发者,如今进一步服务函数计算 FC 产品开发者。近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中,无需再次登录即可使用通义灵码的智能编程能力,实现开......
  • c# System.Guid
    转帖自:http://blog.163.com/very_apple/blog/static/27759236201182744327193/概念GUID:即GloballyUniqueIdentifier(全球唯一标识符)也称作UUID(UniversallyUniqueIDentifier)。GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID主......