我想根据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);
}
}
因此该扩展方法将应用字段列表在CCD_ 2源上进行排序;OrderBy";(如果是第一次(或";ThenBy";(否则(。
然后你可以像这样使用它:
var table1Result = table1
.SortBy(new string[] { "Id", "Name", "Phone" });