在Linq中动态排序依据 [英] Dynamic Order By in Linq
问题描述
我有一个访问数据库的应用程序,必须根据输入的不同字段对结果进行排序.
I have an app that accesses database and has to order results by different fields depending on the input.
这是我的排序功能:
IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLower())
{
case "id":
result = result.OrderBy(c => c.Id);
break;
case "code":
result = result.OrderBy(c => c.Code);
break;
case "active":
result = result.OrderBy(c => c.Active);
break;
default:
result = result.OrderBy(c => c.Name);
break;
}
if (pageData.SortDesc)
{
var res = result.ToList();
res.Reverse();
return res.AsQueryable();
}
return result;
}
此代码有一些我不喜欢的问题:
There are some problems with this code that I don't like:
-
重复代码太多.如果它是纯
SQL
"查询,则看起来像是
选择* FROM data_table订购案例@OrderBy当"id"然后"id"时当编码"然后编码
当活跃"然后活跃ELSE名称
结尾;
SELECT * FROM data_table
ORDER BY
CASE @OrderBy
WHEN 'id' THEN id
WHEN 'code' THEN code
WHEN 'active' THEN active
ELSE name
END
;
转换为列表并返回以进行反转.我无法更改返回类型,并且我绝对不想编写更多无用的代码(使用 OrderByDescending
实质上将 switch
switch case
加倍).
Conversion to list and back for reversing. I can not change return type and I definitely do not want to write even more useless code (essentially doubling switch
case
with OrderByDescending
).
有人可以建议使此功能更好看的方法,最好还是使用 LINQ
吗?
Can anyone suggest ways of making this function better-looking, preferably still using LINQ
?
推荐答案
好吧,您肯定想要使用 OrderByDescending
而不是反转.它不会像SQL那样简短,但是您至少可以使用:
Well, you definitely want to use OrderByDescending
instead of reversing. It's not going to be quite as brief as the SQL, but you could at least use:
IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLowerInvariant())
{
case "id":
return desc ? result.OrderByDescending(c => c.Id) : result.OrderBy(c => c.Id);
case "code":
return desc ? result.OrderByDescending(c => c.Code) : result.OrderBy(c => c.Code);
case "active":
return desc ? result.OrderByDescending(c => c.Active) : result.OrderBy(c => c.Active);
default:
return desc ? result.OrderByDescending(c => c.Name) : result.OrderBy(c => c.Name);
}
}
您可以使用自己的扩展方法删除该重复项:
You could remove that repetition with your own extension method:
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(
this IQueryable<TSource> source,
Expression<Func<TSource, TKey>> keySelector,
bool descending) =>
descending ? source.OrderByDescending(keySelector) : source.OrderBy(keySelector);
然后写:
IQueryable<Entity> GetSortedData(IQueryable<Entity> result, String orderby, bool desc)
{
switch (orderby.ToLowerInvariant())
{
case "id": return result.OrderBy(c => c.Id, desc);
case "code": return result.OrderBy(c => c.Code, desc);
case "active": return result.OrderBy(c => c.Active, desc);
default: return result.OrderBy(c => c.Name, desc);
}
}
这篇关于在Linq中动态排序依据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!