IEnumerable<T> / IQueryable<T> 上的动态LINQ OrderBy

749

我在VS2008的示例中找到了一个关于动态LINQ的例子,允许你使用类似SQL语句的字符串(例如OrderBy("Name, Age DESC"))进行排序。不幸的是,该方法只适用于IQueryable<T>。是否有办法在IEnumerable<T>上实现这个功能呢?

24个回答

-1

如果您正在使用规范(例如Ardalis Specification

using Microsoft.EntityFrameworkCore;

namespace TestExtensions;

public static class IQueryableExtensions
{
    public static void ApplyOrder<T>(ISpecificationBuilder<T> query, string propertyName, bool ascendingOrder)
    {
        if (ascendingOrder)
            query.OrderBy(T => EF.Property<object>(T!, propertyName));
        else
            query.OrderByDescending(T => EF.Property<object>(T!, propertyName));
    }
}

因为这并没有回答问题:“有没有办法在IEnumerable<T>上获得这个功能?”。在Stack Overflow上,我们不会通过提供替代方案来回答人们正在做什么的问题,因为这可能会一直持续下去。只有当问题中的方法明显无望时,我们才会这样做。 - Gert Arnold
我回答是因为我也遇到了同样的问题,并且我在答案中添加了if语句...不过,感谢你解释了为什么要给我点踩。 - Joseph Wambura

-1

使用 Net6 和 EF

.AsQueryable().OrderBy((ColumnOrder.Column, ColumnOrder.Dir));
                            

-1

我可以用下面的代码来实现这个。不需要编写长而复杂的代码。

 protected void sort_array(string field_name, string asc_desc)
        {

            objArrayList= Sort(objArrayList, field_name, asc_desc);
        }

        protected List<ArrayType> Sort(List<ArrayType> input, string property, string asc_desc)
        {
            if (asc_desc == "ASC")
            {

                return input.OrderBy(p => p.GetType()
                                           .GetProperty(property)
                                           .GetValue(p, null)).ToList();
            }
            else
            {
                return input.OrderByDescending(p => p.GetType()
                                               .GetProperty(property)
                                               .GetValue(p, null)).ToList();
            }
        }

-3
var result1 = lst.OrderBy(a=>a.Name);// for ascending order. 
 var result1 = lst.OrderByDescending(a=>a.Name);// for desc order. 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接