【问题标题】:linq orderby using property name stringlinq orderby 使用属性名称字符串
【发布时间】:2019-02-13 02:55:26
【问题描述】:

我有一个需要订购的清单,例如。

var list = someelements;

我还有一个参数,说明我应该通过哪个属性和哪个方向订购列表数据。

var sortby = "Name";
var sortdirection = "desc";

我想知道是否可以将字符串属性名称与正确的属性匹配,所以我得到:

var list = someelements.OrderBy(x => x.Name).ToList();

sortby == "Name" 不需要使用 switch 循环检查属性名称并将正确的属性分配给 OrderBy。

同样,我想通过选择 OrderByOrderByDescending 来实现,这取决于我得到的是 sortdirection = "asc" 还是 sortdirection = "desc"

有可能吗?如果可以,怎么做?

【问题讨论】:

标签: c# linq sorting


【解决方案1】:

您可以通过 Nuget 获取Dynamic Linq。然后你可以使用.OrderBy(sortby + " " + sortdirection)。 这是链接:Dynamic Linq

【讨论】:

【解决方案2】:

这是一种不使用 Dynamic Linq 的解决方案:

public class Helper
{
    public static IEnumerable<T> OrderByDynamic<T>(IEnumerable<T> items, string sortby, string sort_direction)
    {
        var property = typeof (T).GetProperty(sortby);

        var result = typeof(Helper)
            .GetMethod("OrderByDynamic_Private", BindingFlags.NonPublic | BindingFlags.Static)
            .MakeGenericMethod(typeof (T), property.PropertyType)
            .Invoke(null, new object[]{ items, sortby, sort_direction});

        return (IEnumerable<T>)result;
    }

    private static IEnumerable<T> OrderByDynamic_Private<T,TKey>(IEnumerable<T> items, string sortby, string sort_direction)
    {
        var parameter = Expression.Parameter(typeof (T), "x");

        Expression<Func<T, TKey>> property_access_expression =
            Expression.Lambda<Func<T, TKey>>(
                Expression.Property(parameter, sortby),
                parameter);

        if (sort_direction == "asc")
        {
            return items.OrderBy(property_access_expression.Compile());
        }

        if (sort_direction == "desc")
        {
            return items.OrderByDescending(property_access_expression.Compile());
        }

        throw new Exception("Invalid Sort Direction");
    }
}

你可以这样使用它:

var result = Helper.OrderByDynamic(list, "Name", "desc").ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多