【问题标题】:Linq Sort Direction From StringLinq 从字符串中排序方向
【发布时间】:2010-12-02 08:55:05
【问题描述】:

我正在尝试对一组用户进行排序。我可以访问排序属性和方向(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;
}

【问题讨论】:

    标签: c# linq linq-to-sql sorting sortdirection


    【解决方案1】:

    理想情况下,你想使用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 传入选择器和布尔值?

    如果您不需要静态类型,您当然也可以从头开始动态构建表达式,例如 this short sample(本质上类似于动态 LINQ 库)。

    【讨论】:

    • 效果很好,谢谢。我将 bool 更改为使用 System.ComponentModel.ListSortDirection
    • 一个IBindingList/IBindingListView,然后呢?
    • 我们曾经有过“有一个应用程序可以做到这一点”的时尚,
    【解决方案2】:

    我认为这是一个 if 语句,没有其他简单的方法可以做到这一点,即:

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

    也看看这个:Sorting a list using Lambda/Linq to objects

    【讨论】:

      【解决方案3】:

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

      但请务必检查用户输入!

      【讨论】:

        猜你喜欢
        • 2020-01-29
        • 1970-01-01
        • 2014-01-05
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        相关资源
        最近更新 更多