2010-06-20 129 views
5

如何通過列變量進行訂單,因爲我在頁面上有一個下拉菜單,並且我想根據在此下拉列表中選擇的上下訂單來顯示網格,例如價格,代碼,評級,描述等我等,我不想爲每列寫一個單獨的查詢。希望通過Linq查詢中的變量進行查詢

from lm in lDc.tbl_Products 
where lm.TypeRef == pTypeId 
orderby lm.Code ascending 
select new; 
+0

參見:http://stackoverflow.com/questions/41244/dynamic-linq-orderby – 2010-06-20 08:23:39

回答

6

假設你想通過SQL進行排序,那麼你將需要通過排序列/類型。查詢被推遲,直到你真正做的選擇,所以你可以建立步驟查詢,一旦你完成像這樣執行它:如果你想這樣做SQL之外,那麼只得到一個基本的

// Do you query first. This will NOT execute in SQL yet. 
var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId); 

// Now add on the sort that you require... you could do ascending, descending, 
// different cols etc.. 
switch (sortColumn) 
{ 
    case "Price": 
     query = query.OrderBy(q => q.Price); 
     break; 
    case "Code": 
     query = query.OrderBy(q => q.Code); 
     break; 
    // etc... 
} 

// Now execute the query to get a result 
var result = query.ToList(); 

導致不進行排序,然後將OrderBy應用到您需要的排序條件的結果庫中。

+0

中聲明orderedData,以及如果我在查詢中還有一些聯接? – Azhar 2010-06-26 07:19:23

+0

@Azhar只需在'Where'後添加'Join',其他所有工作都應該一樣。 'Join'只會連接到另一個'IQueryable'。 – Kelsey 2010-06-26 18:44:38

0

您可以在不同的步驟中「建立」一個LINQ查詢。

生成您的基本查詢以返回未排序的信息。在您嘗試枚舉結果之前,不會執行該查詢。

var data = from lm in lDc.tbl_Products 
      where lm.TypeRef == pTypeId 
      select new; 

然後在您的事件處理函數中,在將結果綁定到網格之前,應用您希望的任何排序。

var orderedData = from lm in data 
        order lm.Code ascending 
        select new; 

// TODO: Display orderedData in a grid. 

您列舉的完整查詢是將要評估的完整查詢。這意味着您可以爲下拉菜單中的每個項目運行單獨的查詢,這些查詢是通過「基本」查詢構建的。

+0

是但在此我必須寫多個if語句?我可以從if語句 – Azhar 2010-06-20 07:25:39

3
public static IEnumerable<T> OrderByIf<T,TKey>(this IEnumerable<T> source, bool condition, Func<T, TKey> keySelector) 
    { 
     return (condition) ? source.OrderBy(keySelector).AsEnumerable() : source; 
    } 

用法:

  var query = lDC.tbl_Products.Where(p => p.TypeRef == pTypeId) 
            .OrderByIf(sortColumn == "Price", p => p.Price) 
            .OrderByIf(sortColumn == "Code", p => p.Code);