EF OrderBy(string propertyname), OrderByDescending(string propertyname) 按属性排序,扩展方法
Posted 计划着变化的计划
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF OrderBy(string propertyname), OrderByDescending(string propertyname) 按属性排序,扩展方法相关的知识,希望对你有一定的参考价值。
public static class LinqExtensions { private static PropertyInfo GetPropertyInfo(Type objType, string name) { var properties = objType.GetProperties(); var matchedProperty = properties.FirstOrDefault(p => p.Name == name); if (matchedProperty == null) throw new ArgumentException("name"); return matchedProperty; } private static LambdaExpression GetOrderExpression(Type objType, PropertyInfo pi) { var paramExpr = Expression.Parameter(objType); var propAccess = Expression.PropertyOrField(paramExpr, pi.Name); var expr = Expression.Lambda(propAccess, paramExpr); return expr; } public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> query, string name) { var propInfo = GetPropertyInfo(typeof(T), name); var expr = GetOrderExpression(typeof(T), propInfo); var method = typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType); return (IEnumerable<T>)genericMethod.Invoke(null, new object[] { query, expr.Compile() }); } public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string name) { var propInfo = GetPropertyInfo(typeof(T), name); var expr = GetOrderExpression(typeof(T), propInfo); var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderBy" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType); return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr }); } public static IEnumerable<T> OrderByDescending<T>(this IEnumerable<T> query, string name) { var propInfo = GetPropertyInfo(typeof(T), name); var expr = GetOrderExpression(typeof(T), propInfo); var method = typeof(Enumerable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType); return (IEnumerable<T>)genericMethod.Invoke(null, new object[] { query, expr.Compile() }); } public static IQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string name) { var propInfo = GetPropertyInfo(typeof(T), name); var expr = GetOrderExpression(typeof(T), propInfo); var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == "OrderByDescending" && m.GetParameters().Length == 2); var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType); return (IQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr }); } }
YourDbContext db = new YourDbContext();
这样就可以直接使用下面这个方法了, db.TableName.OrderBy("ColumnName"), 用于动态排序时需要
以上是关于EF OrderBy(string propertyname), OrderByDescending(string propertyname) 按属性排序,扩展方法的主要内容,如果未能解决你的问题,请参考以下文章
迁移到 .net core 3.1 后 EF OrderBy 出现问题
我可以通过在 EF Core 和 SQL Server 中的 OrderBy() 之前使用 Where() 来提高查询的性能吗?
为啥 EF Core 最后要添加一个额外的 ORDER BY
Mybatismybatis查询报错org.apache.ibatis.reflection.ReflectionException: There is no getter for propert(代