首页 > 其他分享 >动态排序

动态排序

时间:2024-05-17 17:30:36浏览次数:21  
标签:动态 string OrderByDescending Age sortParam new 排序 Expression

using DynamicSort;
using Microsoft.EntityFrameworkCore;

List<StudnetEntity> studentList = new List<StudnetEntity>()
{
    new StudnetEntity(){ Name = "Chen", Age = 28},
    new StudnetEntity(){ Name = "Wang", Age = 29}
};

//排序属性可以在编译时确定
List<StudnetEntity> staticOrderList = studentList.OrderByDescending(a => a.Age).ToList();

//Entity Framework的动态排序
//排序属性可以在运行时确定。
//直接使用报错The EF.Property<T> method may only be used within Entity Framework LINQ,
//必须使用DbContext,也就是Entity Framework的
//例如DbContext.Entity.OrderByDescending(e => EF.Property<Object>(e, sortParam)).ToList();
string sortParam = "Age";
//List<StudnetEntity> dynamicOrderList = studentList.OrderByDescending(e => EF.Property<Object>(e, sortParam)).ToList();

string sortParamValue = "Age";
List<StudnetEntity> newdynamicOrderList = studentList.AsQueryable().OrderByDynamic(sortParamValue, true).ToList();

newdynamicOrderList.ForEach(a =>
{
    Console.WriteLine(a.Name + a.Age);
});

public class StudnetEntity
{
    public string Name { get; set; }
    public int Age { get; set; }
}
using System.Linq.Expressions;

namespace DynamicSort
{
    public static class SortHelper
    {
        public static IQueryable<T> OrderByDynamic<T>(this IQueryable<T> query, string sortParam, bool desc)
        {
            // 检查 sortParam 是否为空或空字符串
            if (string.IsNullOrEmpty(sortParam))
            {
                throw new ArgumentException("Sort parameter cannot be null or empty", nameof(sortParam));
            }
            // 获取 T 类型的信息
            var entityType = typeof(T);
            // 尝试获取指定名称的属性
            var property = entityType.GetProperty(sortParam);
            // 如果属性不存在,则抛出异常
            if (property == null)
            {
                throw new ArgumentException($"Property '{sortParam}' not found on type '{entityType.Name}'");
            }
            // 创建一个参数表达式,代表单个实体实例
            var parameter = Expression.Parameter(entityType, "e");
            // 创建属性访问表达式,代表对该属性的访问
            var propertyAccess = Expression.MakeMemberAccess(parameter, property);
            // 创建 lambda 表达式,表示对实体的属性访问
            var orderByExpression = Expression.Lambda(propertyAccess, parameter);
            // 根据 desc 参数决定使用 OrderBy 还是 OrderByDescending
            string methodName = desc ? "OrderByDescending" : "OrderBy";
            // 构建排序方法调用表达式
            var resultExpression = Expression.Call(
                typeof(Queryable),                 // 静态类 Queryable
                methodName,                        // 方法名:OrderBy 或 OrderByDescending
                new Type[] { entityType, property.PropertyType },  // 泛型参数
                query.Expression,                  // 原始查询表达式
                Expression.Quote(orderByExpression)  // lambda 表达式
            );
            // 创建并返回新的排序后的查询
            return query.Provider.CreateQuery<T>(resultExpression);
        }
    }
}

 

标签:动态,string,OrderByDescending,Age,sortParam,new,排序,Expression
From: https://www.cnblogs.com/HuairongChen/p/18198192

相关文章

  • 关于IDEA使用xml实现动态sql的问题
     如上图,我在mapper层编写了一个list方法用于实现动态sql。1.导入使用xml文件的mybatis依赖。 2.配置文件的修改.properties .yml mybatis.mapper-locations=classpath:mapper/*.xml:这个配置项指定了MyBatis映射器XML文件的位置。值classpath:mapper/*.xml......
  • macOS开发,如何设置动态桌面壁纸(动态壁纸酷)
    1.首先要先建立一个全屏的窗口1//获取窗口控制器2NSStoryboard*storyboard=[NSStoryboardstoryboardWithName:@"Main"bundle:[NSBundlemainBundle]];3WallpaperWindowController*wwc=[storyboardinstantiateControllerWithIdentifier:@"AboutWindowController......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线动态填充 word 文件
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)芯片架构。在实际的Word文档开发中,经常需要自动填充数据到Word模板中,以生成动态的Word文档。例如,我们可以根据数据库表中已保存的个人信息,设计好一个简历模板docx文件,......
  • 动态规划
    ABC207EModi显然有\(n^3\)的dp。设\(f_{i,j}\)表示前\(i\)个数里划分\(j\)段(\(i\)为第\(j\)段结尾)的方案数,\(s_i=\sum_{i=1}^ia_i\),则有:\[f_{i,1}=1,f_{i,j}=\sum_{k=1}^{i-1}[s_i-s_k\equiv0\pmodj]f_{k,j-1}\]考虑进一步优化。我们发现上式可以化为:\[f_{......
  • python算法:详细图解: 排序:冒泡排序
    一,什么是冒泡排序?1,冒泡排序和快速排序都属于交换排序所谓交换,就是对序列中两个元素根据键值的比较结果来对换这两个记录在序列中的位置交换排序的特点:将键值较大的元素向序列的尾部移动,键值较小的元素向序列的前部移动2,冒泡排序:BubbleSort,是一种最基础的交换排序,冒泡排......
  • Dynamic-Datasource动态数据源
    1、添加请求对应的数据源标签DynamicDataSourceContextHolder.push(ds);2、添加数据源  3、动态添加数据源privateDynamicRoutingDataSourcedataSource;privateDefaultDataSourceCreatordataSourceCreator;//创建数据源DataSourcePropertydataSourceProperty......
  • 聊聊MySQL是如何处理排序的
    本文分享自华为云社区《MySQL怎样处理排序⭐️如何优化需要排序的查询?》,作者:菜菜的后端私房菜。前言在MySQL的查询中常常会用到 orderby 和 groupby 这两个关键字它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢?当使用的查询语句需要进行排序时有两种......
  • 快速排序代码实现
    代码如下:1#include<stdio.h>2//快速排序函数,形参列表为数组,左指针位置,右指针位置,int*arr等价于intarr[]3voidQkSort(int*arr,intleft,intright){4if(left>right)//左指针位置必须大于右指针位置5{6return;7}8//变......
  • 二维数组排序
    为了更灵活地控制排序字段和排序顺序,可以修改DataSorter类,使其能够通过参数指定排序字段和排序顺序。以下是实现方法:DataSorter类<?phpclassDataSorter{/***按指定字段和顺序排序二维数组**@paramarray$data要排序的二维数组*@param......
  • 洛谷题单指南-动态规划3-P1220 关路灯
    原题链接:https://www.luogu.com.cn/problem/P1220题意解读:按坐标顺序排列1~n个路灯,每个路灯有不同的功耗,老张从位置c开始关灯,第一时间关掉c位置的灯,每次关掉一个灯之后,可以往右走、也可以往左走关下一个灯,老张速度是1m/s,求所有灯都关掉所消耗的最少功耗。解题思路:由题意分析,关......