代码之家  ›  专栏  ›  技术社区  ›  Razor

LINQ查询在同一查询中需要升序或降序

  •  6
  • Razor  · 技术社区  · 16 年前

    var linq = new NorthwindDataContext();
    
            var query1 = linq.Customers
                .Where(c => c.ContactName.StartsWith("a"))
                .SelectMany(cus=>cus.Orders)
                .OrderBy(ord => ord.OrderDate)
                .Select(ord => ord.CustomerID);
    
            var query2 = linq.Customers
                .Where(c => c.ContactName.StartsWith("a"))
                .SelectMany(cus => cus.Orders)
                .OrderByDescending(ord => ord.OrderDate)
                .Select(ord => ord.CustomerID);
    
    5 回复  |  直到 9 年前
        1
  •  12
  •   joelsand    13 年前

    您可以创建自己的可重用扩展方法,该方法将执行以下操作:

    public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>
        (this IQueryable<TSource> source,
         Expression<Func<TSource, TKey>> keySelector,
         bool ascending)
    {
         return ascending ? source.OrderBy(keySelector)
              : source.OrderByDescending(keySelector);
    }
    

    同样地,对于 ThenBy :

    public static IOrderedQueryable<TSource> ThenBy<TSource, TKey>
        (this IOrderedQueryable<TSource> source,
         Expression<Func<TSource, TKey>> keySelector,
         bool ascending)
    {
         return ascending ? source.ThenBy(keySelector)
              : source.ThenByDescending(keySelector);
    }
    
        2
  •  2
  •   Mark Byers    16 年前

    您可以将查询拆分为若干位,并使用控制流逻辑。linqtosql将神奇地构造正确的查询,就像您在一行中键入了所有查询一样!这样做的原因是,在您请求数据之前,查询不会发送到数据库,而是作为表达式存储。

    var linq = new NorthwindDataContext();
    var query = linq.Customers
        .Where(c => c.ContactName.StartsWith("a"))
        .SelectMany(cus=>cus.Orders);
    
    IOrderedQueryable<Order> query2;
    if (useAscending) {
        query2 = query.OrderBy(ord => ord.OrderDate);
    } else {
        query2 = query.OrderByDescending(ord => ord.OrderDate);
    }
    
    var query3 = query2.Select(ord => ord.CustomerID);
    
        3
  •  1
  •   LPL user462990    15 年前
    return from T in bk.anbarsabts
           where T.kalaname == str
           orderby T.date descending
           select new { T.date, T.kalaname, T.model, T.tedad };
    
        4
  •  0
  •   leppie    16 年前

    对于数字等,你通常可以对“排序变量”求反。

    与 DateTime Timespan .

        5
  •  0
  •   Nikos Steiakakis    16 年前

    好吧,如果你有一个条件,你决定顺序是上升还是下降,你可以用这个

    var query1 = linq.Customers
    .Where(c => c.ContactName.StartsWith("a"))
    .SelectMany(cus=>cus.Orders)
    
    if(SortAscending)
       query1 = query1.OrderBy(ord => ord.OrderDate);
    else
       query1 = query1.OrderByDescending(ord => ord.OrderDate);
    
    var query2 = query1.Select(ord => ord.CustomerID);