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,也就是说,它不适用于实体框架<代码>字段选择器应该是一个表达式
。