[英]Linq Sort Direction From String
我正在嘗試對一組用戶進行排序。 我可以訪問排序屬性和方向(asc,desc)。 我目前的查詢訂單如下。 但正如您所看到的那樣,它並未考慮排序方向。 如何在不必使用Dynamic Linq或為“asc”或“desc”排序方向添加另一組語句的情況下構建此表達式。
public override IQueryable<DalLinq.User> GetSort(IQueryable<DalLinq.User> query)
{
//SelectArgs.SortDirection <- Sort Direction
switch (SelectArgs.SortProperty)
{
case "LastName":
query = query.OrderBy(p => p.LastName);
break;
case "FirstName":
query = query.OrderBy(p => p.FirstName);
break;
default:
query = query.OrderBy(p => p.UserName);
break;
}
return query;
}
理想情況下,您想使用OrderByDescending
- 您當然可以作弊:
public static class MyExtensionMethods
{
public static IOrderedQueryable<TSource> OrderBy<TSource,TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource,TValue>> selector,
bool asc)
{
return asc ? source.OrderBy(selector) : source.OrderByDescending(selector);
}
}
並使用OrderBy
傳遞選擇器和bool?
如果你不需要靜態類型,你也可以從頭開始動態構建表達式 - 當然 - 就像這個簡短的樣本 (本質上類似於動態LINQ庫)。
我認為這是一個if語句,沒有其他簡單的方法可以做到,即:
query = (SelectArgs.SortDirection == "asc") ? query.OrderBy(p => p.LastName)
: query.OrderByDescending(p => p.LastName);
看看這個: 使用Lambda / Linq對對象排序列表
看看CS代碼示例。 Linq有一個動態的例子。
來自樣本:
Northwind db = new Northwind(connString);
db.Log = Console.Out;
var query =
db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
OrderBy("CompanyName").
Select("New(CompanyName as Name, Phone)");
按代碼訂購:
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
return (IQueryable<T>)OrderBy((IQueryable)source, ordering, values);
}
public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) {
if (source == null) throw new ArgumentNullException("source");
if (ordering == null) throw new ArgumentNullException("ordering");
ParameterExpression[] parameters = new ParameterExpression[] {
Expression.Parameter(source.ElementType, "") };
ExpressionParser parser = new ExpressionParser(parameters, ordering, values);
IEnumerable<DynamicOrdering> orderings = parser.ParseOrdering();
Expression queryExpr = source.Expression;
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
foreach (DynamicOrdering o in orderings) {
queryExpr = Expression.Call(
typeof(Queryable), o.Ascending ? methodAsc : methodDesc,
new Type[] { source.ElementType, o.Selector.Type },
queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters)));
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}
return source.Provider.CreateQuery(queryExpr);
}
但請務必檢查用戶輸入!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.