加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – linq排序列表(MyObjects)

发布时间:2020-12-16 00:12:38 所属栏目:asp.Net 来源:网络整理
导读:如何通过我的对象列表中的传递字符串值进行排序?我需要在我的List(Of)对象上进行分页和排序,分页没有问题,但我不知道是谁让Order By工作. 这是我目前正在做的事情,它的工作很棒: Return returnReports.Skip(PageSize * (PageNumber-1)).Take(PageSize).ToL
如何通过我的对象列表中的传递字符串值进行排序?我需要在我的List(Of)对象上进行分页和排序,分页没有问题,但我不知道是谁让Order By工作.

这是我目前正在做的事情,它的工作很棒:

Return returnReports.Skip(PageSize * (PageNumber-1)).Take(PageSize).ToList()

我如何让它工作?

Return returnReports.OrderBy(SortColumn).Skip(skip).Take(PageSize).ToList()

SortColumn是传递的字符串值

解决方法

VB
Module OrderByExtensions
  <System.Runtime.CompilerServices.Extension()> _
  Public Function OrderByPropertyName(Of T)(ByVal e As IEnumerable(Of T),ByVal propertyName As String) As IOrderedEnumerable(Of T)
    Dim itemType = GetType(T)
    Dim prop = itemType.GetProperty(propertyName)
    If prop Is Nothing Then Throw New ArgumentException("Object does not have the specified property")
    Dim propType = prop.PropertyType
    Dim funcType = GetType(Func(Of,)).MakeGenericType(itemType,propType)
    Dim parameter = Expression.Parameter(itemType,"item")
    Dim exp = Expression.Lambda(funcType,Expression.MakeMemberAccess(parameter,prop),parameter)
    Dim params = New Object() {e,exp.Compile()}
    Return DirectCast(GetType(OrderByExtensions).GetMethod("InvokeOrderBy",Reflection.BindingFlags.Static Or Reflection.BindingFlags.NonPublic).MakeGenericMethod(itemType,propType).Invoke(Nothing,params),IOrderedEnumerable(Of T))
  End Function
  Private Function InvokeOrderBy(Of T,U)(ByVal e As IEnumerable(Of T),ByVal f As Func(Of T,U)) As IOrderedEnumerable(Of T)
    Return Enumerable.OrderBy(e,f)
  End Function
End Module

C#

public static class OrderByExtensions
{
  public static IOrderedEnumerable<T> OrderByPropertyName<T>(this IEnumerable<T> e,string name)
  {
    var itemType = typeof(T);
    var prop = itemType.GetProperty(name);
    if (prop == null) throw new ArgumentException("Object does not have the specified property");
    var propType = prop.PropertyType;
    var funcType = typeof(Func<,>).MakeGenericType(itemType,propType);
    var parameter = Expression.Parameter(itemType,"item");
    var memberAccess = Expression.MakeMemberAccess(parameter,prop);
    var expression = Expression.Lambda(funcType,memberAccess,parameter);
    var x = typeof(OrderByExtensions).GetMethod("InvokeOrderBy",BindingFlags.Static | BindingFlags.NonPublic);
    return (IOrderedEnumerable<T>)x.MakeGenericMethod(itemType,propType).Invoke(null,new object[] { e,expression.Compile() });
  }
  static IOrderedEnumerable<T> InvokeOrderBy<T,U>(IEnumerable<T> e,Func<T,U> f)
  {
    return e.OrderBy(f);
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读