2015-06-21 31 views
6

我可以排序依據語句動態地構建LINQ查詢象下面這樣:如何動態添加降序到orderby?

var Query = from q in Db.TblUsers select q; 

switch (Order) 
{ 
    case "Name": Query = from q in Query orderby q.Name select q; break; 
    case "DOB": Query = from q in Query orderby q.DOB select q; break; 
    // ... and more cases 
} 

var Result = Query.ToList(); 

但是,如果有必要,責令降序(取決於用戶選擇在UI),我將不得不構造另一個switch語句複製所有的情況只是爲了在orderby之後添加「降序」關鍵字。

例如:

if (ascending) 
{ 
    switch (Order) 
    { 
     case "Name": Query = from q in Query orderby q.Name select q; break; 
     // .... 
    } 
} 
else 
{ 
    switch (Order) 
    { 
     case "Name": Query = from q in Query orderby q.Name descending select q; break; 
     // .... 
    } 
} 

有沒有辦法對我來說,動態地添加只是下降關鍵字查詢?

+3

http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet –

+0

也許你可以只需使用'if(!ascending){Query = Query.Reverse(); }'?或者你可以等到你的'List <>'它可以在原地顛倒:'Result.Reverse();' –

回答

2

這不是很大,但它不是不好:

var Query = Db.TblUsers.AsQueryable(); 

switch (Order) 
{ 
    case "Name": Query = ascending ? 
        Query.OrderBy(q=>q.Name) : 
        Query.OrderByDescending(q=>q.Name); 
     break; 
    case "DOB": Query = ascending ? 
        Query.OrderBy(q=>q.DOB) : 
        Query.OrderByDescending(q=>q.DOB); 
     break; 
    // ... and more cases 
} 

var Result = Query.ToList(); 

+0

@xanatos:爲什麼不加addthat作爲答案?不過,一定要包含所有的代碼。 –

1

考慮:

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

     return source.OrderByDescending(keySelector); 
    } 
} 

您可以:

var Query = Db.TblUsers.AsQueryable(); 

switch (Order) 
{ 
    case "Name": 
     Query = Query.OrderBy(q=>q.Name, ascending); 
     break; 
    case "DOB": 
     Query = Query.OrderBy(q=>q.DOB, ascending); 
     break; 
    // ... and more cases 
} 
+0

很酷,到目前爲止的最佳答案! –