c# - 使用 Func 进行动态排序, IOrderedQueryable>
问题描述
我想根据Id,Nam,Phone和Email查询结果并按顺序显示任何人都可以帮助我如何做到这一点。预期结果
table1result=> table1.OrderBy(c => c.Id).ThenBy(c => c.Name).ThenBy(c => c.table2.Name).ThenBy(c=>c.table2.Phone)
下面是导致的示例代码
Func<IQueryable<T>, IOrderedQueryable<T>> orderExpression = o => o.OrderBy(a => a.Id);
switch(case)
{
case "Id" : orderExpression = o => o.OrderBy(a => a.Id);
break;
case "name" : orderExpression = o => o.OrderBy(a => a.Name);
break;
case "phone" : orderExpression = o => o.OrderBy(a => a.table2.phone);
break;
.
.
.
.
}
which result in
table1result=> table1.OrderBy(a => a.Id);
解决方案
我写了一个IQueryable<T>
扩展,也许这对你的情况有帮助:
public static class QueryableExtensions
{
public static IQueryable<T> SortBy<T>(this IQueryable<T> source,
IEnumerable<string> fieldsToSort)
{
Expression expression = source.Expression;
bool firstTime = true;
foreach (var f in fieldsToSort)
{
// { x }
var parameter = Expression.Parameter(typeof(T), "x");
// { x.FIELD }, e.g, { x.ID }, { x.Name }, etc
var selector = Expression.PropertyOrField(parameter, f);
// { x => x.FIELD }
var lambda = Expression.Lambda(selector, parameter);
// You can include sorting directions for advanced cases
var method = firstTime
? "OrderBy"
: "ThenBy";
// { OrderBy(x => x.FIELD) }
expression = Expression.Call(
typeof(Queryable),
method,
new Type[] { source.ElementType, selector.Type },
expression,
Expression.Quote(lambda)
);
firstTime = false;
}
return firstTime
? source
: source.Provider.CreateQuery<T>(expression);
}
}
因此,此扩展方法将应用字段列表IQueryable
以使用“OrderBy”(如果是第一次)或“ThenBy”(否则)对源进行排序。
然后你可以像这样使用它:
var table1Result = table1
.SortBy(new string[] { "Id", "Name", "Phone" });
推荐阅读
- java - 为什么Java流API中的某些收集器称为下游收集器?
- ios - 检查 UITextField 是否仅为字符/数字
- wpf - WPF PrintPreview 获取 DocumentPaginator 页面的 PageContent
- python-3.x - Tensorflow-gpu 没有检测到 GPU?
- node.js - nodejs:子进程不执行 process.on('message')
- node.js - 我的 graphql 服务器查询返回空值
- asp.net-core - 使用 Azure AD 登录并获取 UserManager
- javascript - 如何从 tr 获取 id,然后使用 JavaScript 在新的 td 中显示该 id?
- sockets - 除非我使用绑定,否则 Pyzmq SUB 不会收到消息
- java - 从基本链表组合或继承创建双向链表(DLL)?