簡體   English   中英

如何有選擇地反轉Linq-to-Sql中的排序順序?

[英]How do I optionally reverse the sorting order in Linq-to-Sql?

我有以下代碼:

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids)
{
    return from id in ids join storedId in storedIds on id equals storedId.Id
        orderby storedId.Something select id;
}

現在,我想向GetOrdered()引入參數,並可選地用orderby descending更改orderby 像這樣:

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids, bool descending)
{
    // how do I insert descending into the query below?
    return from id in ids join storedId in storedIds on id equals storedId.Id
        orderby storedId.Something select id;
}

當然,我可以編寫兩個相同的查詢-一個使用orderby ,另一個使用orderby descending但這意味着代碼重復。

或者,我可以對無序集使用子語句,然后像此答案中那樣有條件地對其進行排序,但是問題是我然后需要Select()特定列,而后者Select()將呈現無序結果。

因此,我可以嘗試按照以下答案設計 “智能”訂購條件:

var result = from w in widgets where w.Name.Contains("xyz")
  orderby
    flag ? w.Id : 0,
    flag ? 0 : w.Id descending
  select w;

但是問題是我經常會有一個非數字列,我需要對它進行排序。

在這些條件下如何有條件地顛倒排序順序?

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids, bool descending = false)
{
    var results = from id in ids join storedId in storedIds on id equals storedId.Id
                  select id;

    if (descending)
       results = results.OrderByDescending(o => o.Something);
    else
       results = results.OrderBy(o => o.Something);

    return results;
}

這有點標准的東西。

但是,如果需要按實際未選擇的順序排序,則需要將查詢拆分為多個語句。 您知道,一步一步地構造查詢,就像我們在ADO時代所做的那樣。 首先進行排序,然后為選擇指定列。 因為您沒有實現結果,所以它應該只生成一個sql查詢。

它可能看起來像這樣。

IQueryable<Guid> GetOrdered(IQueryable<Guid> ids, bool descending = false)
{
    var results = storedIds.Where(somecondition);        
    if (descending)
       results = results.OrderByDescending(o => o.Something);
    else
       results = results.OrderBy(o => o.Something);

    return results.Select(o => o.Id);
}

關於你的最后一句話

但是問題是我經常會有一個非數字列,我需要對它進行排序。

確實如此。 可能有一種方法可以解決此問題(例如使用一些工廠,該工廠將根據某些輸入生成要與之進行比較的值),但是對於這樣的任務,這確實是一個過大的殺傷力。 有時,最簡單的解決方案就是最好的解決方案。 太普通的做事方式可能會聞起來很不好。 不要想太多問題;)

要在Linq中實現有條件的OrderBy,您可以執行以下操作:

var flag = sortOrder == "asc";

result.OrderBy(o => flag ? o.Something: "").ThenByDescending(o => flag ? "" : o.Something).ToList();

為我工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM