![](/img/trans.png)
[英]How do I implement sorting for a custom return type from a linq-to-sql query?
[英]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.