C# LINQ使orderbydesc通用

C# LINQ使orderbydesc通用,c#,linq,C#,Linq,我已经编写了LINQ查询,如下所示,但我只是想知道是否可以使它更通用,并去掉硬编码的值 switch (sortOrder) { case "DESC": if(sortBy == "A") query = query.OrderByDescending(x => x.Field1); if(sortBy == "B") query = query.OrderByDescending(x => x

我已经编写了
LINQ
查询,如下所示,但我只是想知道是否可以使它更通用,并去掉硬编码的值

switch (sortOrder)
{
    case "DESC":
        if(sortBy == "A")
            query = query.OrderByDescending(x => x.Field1);
        if(sortBy == "B")
            query = query.OrderByDescending(x => x.Field2);
        if (sortBy == "C")
            query = query.OrderByDescending(x => x.Field3);
        break;
    default:
        if(sortBy == "A")
            query = query.OrderBy(x => x.Field1);
        if(sortBy == "B")
            query = query.OrderBy(x => x.Field2);
        if (sortBy == "C")
            query = query.OrderBy(x => x.Field3);
        break;
}
重复提到的链接不是我要寻找的答案。在这个问题中,用户通过排序ASC的第一个,然后是Desc来提问


在我的情况下,我必须对ASC或DESC进行排序。

您只能使用反射进行排序。我想:

static IEnumerable<T> Order<T, V>(IEnumerable<T> query, string sortOrder, 
                                    Func<T, V> fieldSelector)
{
    string methodName = sortOrder == "DESC" ? "OrderByDescending" : "OrderBy";
    MethodInfo method = typeof(Enumerable).GetMethods()
                                          .Where(x => x.Name.Contains(methodName))
                                          .FirstOrDefault();

    MethodInfo genericMethod = method.MakeGenericMethod(typeof(Resource), typeof(V));

    var orderedResults = (IEnumerable<T>)genericMethod.Invoke(null, 
                                    new object[] { query, fieldSelector });

    return orderedResults;
}

您只能使用反射来实现这一点,我想:

static IEnumerable<T> Order<T, V>(IEnumerable<T> query, string sortOrder, 
                                    Func<T, V> fieldSelector)
{
    string methodName = sortOrder == "DESC" ? "OrderByDescending" : "OrderBy";
    MethodInfo method = typeof(Enumerable).GetMethods()
                                          .Where(x => x.Name.Contains(methodName))
                                          .FirstOrDefault();

    MethodInfo genericMethod = method.MakeGenericMethod(typeof(Resource), typeof(V));

    var orderedResults = (IEnumerable<T>)genericMethod.Invoke(null, 
                                    new object[] { query, fieldSelector });

    return orderedResults;
}

我不明白您为什么要重新实现LINQ的
OrderBy()
,但我想这是最明智的方法:

public static class Extensions
{
    public static IOrderedQueryable<TSource> Order<TSource, TKey>(
        this IQueryable<TSource> source, 
        Expression<Func<TSource, TKey>> keySelector, 
        bool descending = false)
    {
        return descending 
            ? source.OrderByDescending(keySelector)
            : source.OrderBy(keySelector);
    }   
}

工作示例:

我不明白您为什么要重新实现LINQ的
OrderBy()
,但我想这是最明智的方法:

public static class Extensions
{
    public static IOrderedQueryable<TSource> Order<TSource, TKey>(
        this IQueryable<TSource> source, 
        Expression<Func<TSource, TKey>> keySelector, 
        bool descending = false)
    {
        return descending 
            ? source.OrderByDescending(keySelector)
            : source.OrderBy(keySelector);
    }   
}

工作模式示例:

永远不要使用
字符串来控制执行。使用
bool
flags、
enum
s,或者更好的是使用polymorphy。谁设置
sortBy
变量?是否由用户选择并传递到此代码?切勿使用
string
s来控制执行。使用
bool
flags、
enum
s,或者更好的是使用polymorphy。谁设置
sortBy
变量?是否由用户选择并传递到此代码?请修复您的格式,以便我们可以在不垂直滚动的情况下读取它。同样,这不适用于
IQueryable
s,也就是说,它不适用于实体框架<代码>字段选择器
应该是一个
表达式
。请修改您的格式,以便我们可以在不垂直滚动的情况下读取它。同样,这不适用于
IQueryable
s,也就是说,它不适用于实体框架<代码>字段选择器应该是一个
表达式