Linq 动态排序(Reflection,Expression)要点记录

C#反射PropertyInfo实战:动态获取属性信息与性能优化指南 反射是.NET框架中实现运行时类型检查和动态操作的核心机制,它允许程序在编译后获取和操作类型元数据。其原理基于System.Type类作为类型入口,通过PropertyInfo等元数据对象实现属性的动态读写。这项技术的核心价值在于提升代码的灵活性和通用性,尤其在数据映射、序列化、通用工具开发等场景中不可或缺。然而,反射操作也伴随着显著的性能开销,因此缓存PropertyInfo对象、使用预编译委托等优化策略至关重要。本文聚焦于C#开发中的PropertyInfo应用,深入探讨如何高效获取属性名称与值,并结合 阅读详情
利用反射获取匹配到字段进行排序,附带一下分页
1.排序
            public static IQueryable<T> DataSort<T>(IQueryable<T> source, string fieldName, string sortDirection)
            {
                // 升序 or 降序
                string sortingDir = "OrderBy";
                if ( string.Equals(sortDirection.Trim(),"asc",StringComparison.OrdinalIgnoreCase))
                {
                    sortingDir = "OrderBy";
                }
                if (string.Equals(sortDirection.Trim(), "desc", StringComparison.OrdinalIgnoreCase))
                {
                    sortingDir = "OrderByDescending";
                }
                // 属性
                var orderField = string.Empty;
                Type t = typeof(T);
                var attributes = t.Attributes;
                var fields = t.GetFields();
                var properties = t.GetProperties();
                Type[] types = new Type[2];  //  参数:对象类型,属性类型
                types[0] = typeof(T);
                var isMatch = false;
                foreach (var p in properties)
                {
                    isMatch = string.Equals(fieldName, p.Name, StringComparison.OrdinalIgnoreCase);
                    if (isMatch)
                    {
                        orderField = p.Name;
                        types[1] = p.PropertyType;
                    }
                }
                if (!isMatch)
                {
                    types[1] = properties.First().PropertyType;
                    orderField = properties.First().Name;
                }
                PropertyInfo pi = typeof(T).GetProperty(orderField);
                ParameterExpression param = Expression.Parameter(typeof(T), orderField);
              
                Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, 
                      source.Expression,   Expression.Lambda(Expression.Property(param, orderField),    param));
                IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);
                return query;
            }
获取属性集合
Type t = typeof(T);
 var attributes = t.Attributes;
 var properties = t.GetProperties();
获取属性的类型和名称
  types[1] = properties.First().PropertyType;
 orderField = properties.First().Name;
关键点:调用了 Expression.Call 这个方法,用来创建新的表达式
参数说明:
  Call(Type type, 
  string methodName, 
  Type[] typeArguments, 
  params Expression[] arguments);
  1. Type type:
    Queryable对象类型(typeof(Queryable))Queryable对象类型(typeof(Queryable))

  2. string methodName:
    要执行的方法名(此处为:OrderBy or OrderByDescending)

  3. Type[] typeArguments :
    类型参数,这里有2个,第一个为集合中的对象的类型,第二个为属性类型

  4. params Expression[] arguments :
    多个Expression类型参数,这里有三个,

    1. source.Expression,数据源(IQueryable)
    2. Expression.Lambda(Expression.Property(param, orderField)
      Lambda参数表达式
    3. param:
      参数表达式
需要的结果:创建新的表达式
 IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);
2.分页
 public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)
                {
                    return source.Skip(( Math.Abs(pageNumber)-1) * pageSize).Take(pageSize);
                }
3.排序加分页
            public static IQueryable<T> Sorting<T>(IQueryable<T> source, string fieldName, string sortDirection, int pageIndex, int pageSize)
            {
                IQueryable<T> query = DataSort<T>(source, fieldName, sortDirection);
                return DataPaging(query, pageIndex, pageSize);
            }
手写ASP.NET Core MVC框架:路由、绑定与渲染五步实现 MVC框架是Web开发的核心范式,其本质是HTTP请求在服务端的标准化处理流水线。理解其原理需从请求生命周期切入:路由解析定位资源、模型绑定转换数据、控制器激活协调逻辑、动作执行注入业务、结果渲染生成响应。这一过程高度依赖接口抽象(如IModelBinder、IActionResult)、依赖注入与中间件管道机制,技术价值在于解耦、可扩展与调试可控。典型应用场景包括高级后端面试准备、微服务网关定制、低代码平台内核构建及性能敏感型内部框架研发。本文聚焦.NET 6+环境,以零分配Span优化、RazorLig 阅读详情

相关推荐

微信Dat文件转图片(文末含工具下载)

PC端微信dat图片转换为jpg格式

weixin_40704848的博客 8085

C#特性滥用风险与工程化精简实践

编程语言的抽象能力是双刃剑——它提升开发效率,也隐匿运行时复杂性。当C#引入dynamic、LINQ、Source Generator等高级特性时,其背后涉及的表达式树编译、状态机生成、编译期代码膨胀等机制,正悄然抬高调试成本与认知门槛。这类抽象泄漏现象,在金融、IoT、医疗等强稳定性场景中尤为致命:编译耗时飙升、GC暂停不可控、新人上手周期延长。本文基于真实项目数据,剖析C# 9~12关键特性的工程熵增表现,并提出以编译期守门(Roslyn Analyzer)、运行时监控(DiagnosticSource

didi9310的博客 391

中国银行信息科技岗位笔试

收到笔试只剩四天了,收集的资料,后续会更新

weixin_46050242的博客 4594

写一个针对IQueryable<T>的扩展方法支持动态排序

  所谓的动态排序是指支持任意字段、任意升序降序的排序。我们希望在客户端按如下格式写:localhost:8000/api/items?sort=titlelocalhost:8000/api/items?sort=name,titlelocalhost:8000/api/items?sort=-name,title字段前面加-表示降序,否则是升序。接下来要做的就是解析查询字符串中的字段,组成排...

weixin_34151004的博客 1158

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 462

智能垃圾桶改造指南:树莓派+垃圾分类模型部署全记录(含数据集获取)

本文提供了一份详尽的智能垃圾桶DIY改造指南,核心是利用树莓派部署轻量化的YOLOv8垃圾分类模型。内容涵盖从数据集获取、模型训练与OpenVINO量化优化,到硬件组装、电路连接及软件集成的全流程,旨在帮助创客和爱好者以低成本实现一个能自动识别垃圾并分类的AIoT原型系统。

k6l7m8n9的博客 509

使用Expression进行动态排序分页

Expression动态查询、分页 Expression,表达式树,以lamda表达式创建,就以表达式目录树的形式将强类型的lambda表达式标识为数据结构。 排序 /// <summary> /// 根据条件排序和查询 /// </summary> /// <typeparam name="TKey"...

weixin_30307921的博客 1062

卫朋:IPD流程落地之产品开发验证阶段解读

IPD验证阶段

产品线负责人 1487

IQueryable查询器扩展Expression动态排序

IQueryable查询器扩展Expression动态排序 /// <summary> /// 获取分页排序列表 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="queryable">查询器</param> /// <param name="PageIndex">当前页</param

weixin_40779637的博客 831

《UDS协议从入门到精通》系列——图解0x10:诊断会话控制

什么是诊断会话控制服务?切换模式时ECU要做哪些?有没有通信示例?本文全网最详解!!

车载系统攻城狮 1万+

YOLOv13改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性

Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。

Limiiiing的博客 587

使用Expression做Linq的參數化排序

Linq非常的好用,減少大量的資料庫操作手序,使用具名的類別,減少了在程式中寫SQL寫錯字的可能性,問題來了,如果我想用QueryString中的參數,作為排序的依據,但是因為是具名的類別,不能指定字串,剛開始我是用switch一個一個指定,但欄位一多就覺得這方法很笨,在搜尋更好的方法中發現使用System.Linq.Expressions.Expression可以決解這個問題。 如果各位有仔細看...

weixin_34072857的博客 346

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 331

c# Linq 使用 Expression Tree 创建自定义排序

参考资料:  http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/06/05/composable-linq-to-sql-query-with-dynamic-orderby.aspx http://www.codeproject.com/Articles/230353/An-Example-to-Use-jQuery-Grid-Plugi...

weixin_33721344的博客 471

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在 .NET 中创建对象的几种方式的对比

在 .net 中,创建一个对象最简单的方法是直接使用 new (), 在实际的项目中,我们可能还会用到反射的方法来创建对象,如果你看过Microsoft.Extensions.Depen...

dotNET跨平台 321

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C#生产环境性能四大高危区与诊断实战

在.NET高性能后端开发中,C#的运行时机制(如GC分代模型、async/await状态机、线程池调度、JIT反射开销)决定了真实性能边界。理解这些底层原理,是规避内存风暴、异步陷阱、同步阻塞和动态绑定等典型性能塌方的关键。其技术价值在于将模糊的‘变慢’转化为可度量、可定位、可修复的具体路径——例如通过dotnet-gcdump识别Gen2高频回收,或用dotnet-trace火焰图定位热路径中的ToString()分配热点。典型应用场景覆盖高并发网关、低延迟交易系统、实时ETL任务及Kubernetes原

didi9310的博客 320

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

EF Core深度实战:从契约编译到生产级性能优化

Entity Framework Core(EF Core)本质上是一个对象-关系契约编译器,而非简单的ORM封装工具。它通过模型构建、查询翻译与变更追踪三阶段,将C#领域模型编译为可执行的关系型操作指令。理解其‘契约编译’本质,是规避N+1查询、导航属性膨胀、并发超卖等高频问题的前提;而掌握AsNoTracking、Select投影、ExecuteUpdate等关键机制,则直接决定高并发、大数据量场景下的吞吐与稳定性。本文聚焦EF Core在金融、电商等中大型系统中的真实落地经验,覆盖性能调优、迁移治理、

weixin_40192258的博客 420

Unity游戏开发中SQLite4Unity3d插件核心源码解析与性能优化实践

在游戏开发中,数据持久化是构建丰富游戏体验的基础技术。其核心原理是通过本地存储方案,将游戏状态、玩家进度等结构化数据安全保存。SQLite作为一种轻量级、零配置的嵌入式关系型数据库,因其单文件、高性能和完整的SQL支持,在客户端数据管理领域展现出极高的技术价值。它特别适用于需要复杂查询、数据关联和事务支持的场景,例如管理玩家的卡牌收藏、关卡进度和装备信息。本文以Unity社区广泛使用的SQLite4Unity3d插件为切入点,深入剖析其连接管理、表映射(ORM)等核心机制。通过解析SQLiteConnect

weixin_33857679的博客 522

Reflector None模式:不学IL也能读懂.NET编译逻辑

中间语言(IL)是.NET运行时的底层指令表示,但直接阅读IL成本高、转化率低。其本质并非汇编级真相,而是编译器生成的抽象中间态;真正高效的技术路径,是借助反编译工具的‘裸逻辑还原’能力——如Reflector的None模式,跳过语法糖美化,原样呈现foreach、using、async等特性编译后的goto/try-finally/状态机结构。这种技术价值在于以C#可读形式暴露编译意图,大幅降低认知门槛,支撑性能分析、内存泄漏排查、跨语言理解等典型工程场景。本文聚焦Reflector None模式的实操逻

412

8:c#Expression表达式目录树(by-朝夕)

目录前言什么是表达式目录树?表达式目录树如何解析?表达式目录树特点表达式目录数实用案例代码解析。lambda和expression反编译lambda成expression结尾 前言 什么是表达式目录树? 1.表达式目录树Expression:System.Linq.Expressions; 2.描述了多个变量或者和常量之间的关系,按照一定的规则进行组装!我们需要查看的时候还能够展开! 3.运用表达式目录树,可以对我们的SQL语句拼装进行简化。 //lambda匿名方法 Func<int, int,

王永安的博客 943

EntityFramework动态组合多排序字段

前言:在使用EF当中,肯定会遇到动态查询的需求,建立一个公共调用的动态组合表达式查询也是必不可少的,以下是建立动态组合多排序字段做个记录,供以后调用 1、建立一个结构,用于多个排序字段组合,这个结构体有两个字段,一个是需要排序的属性名,一个是是否是升序降序的判断 public struct OrderModelField { public string prop

chengmodelong的专栏 1446

EF查询数据时根据传递的不同参数排序并分页

#region --------------根据参数动态排序 /// &lt;summary&gt; /// 根据不同参数动态排序 /// &lt;/summary&gt; /// &lt;param name="condition"&gt;Lambda表达式&lt;/param&gt; /// &l...

weixin_42772823的博客 878

LINQ 通过动态生成lambda表达式,实现根据指定属性名称对序列进行排序

目前,对于Linq只是初步接触,还不熟悉,做项目的时候想到一个问题,如果想要查询任意字段的排序结果集,该怎么实现? 我们知道,T-SQL是非常容易解决这个问题,只要简单通过拼接T-SQL就可以达到该效果。 那么,Linq该怎么实现呢? 网上查了很多资料,找到一种办法就是通过自定义拓展方法方式实现,具体实现代码如下: /// /// 根据指定属性名称对序列进

qq506930427的博客 2771

Linq 动态查询排序

Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip(0).Take(10); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query.OrderBy(x=>x.GetType().GetField("Tel")).Skip(0).Take(10); 上面的写法是无法编译通过的,此路不通,于是找到...

weixin_30483495的博客 629
上一篇: web api 配置
下一篇: Distinct 扩展方法(按字段去重)
stoneLSL
博客等级 码龄10年 5粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值