6

一連のユーザーを並べ替えようとしています。並べ替えのプロパティと方向(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;
}
4

3 に答える 3

12

理想的には、使用したい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、セレクターとブール値を渡すことを使用しますか?

静的型付けが必要ない場合は、もちろん、この短いサンプルのように、式をゼロから動的に構築することもできます(本質的に動的 LINQ ライブラリに似ています)。

于 2009-09-29T15:27:19.250 に答える
2

それは if ステートメントだと思いますが、他に簡単な方法はありません。

query = (SelectArgs.SortDirection == "asc") ? query.OrderBy(p => p.LastName)
          : query.OrderByDescending(p => p.LastName);

こちらもご覧ください: Lambda/Linq を使用してリストをオブジェクトにソートする

于 2009-09-29T15:26:04.507 に答える
0

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);
    }

ただし、必ずユーザー入力を確認してください。

于 2009-09-29T15:29:08.357 に答える