2014-12-05 71 views
0

我有一個小問題。目前,我正嘗試通過使用linq查詢來編寫動態順序。LINQ - 按表達式動態排序

我正努力在LINQ實現

select * from tbl 
order by case when Location='Loc9787f85b-c953-4238-8bad-f712b6444443' then 1 
when Location='Loc9787f85b-c953-4238-8bad-f712b6444442' then 2 end 

位置值

SQL查詢檢索並保存在列表中。它可以有一個或多個值。

此解決方案似乎適用於靜態位置值。由於我動態檢索位置值,我不知道如何實現動態位置值。

var temp = tbl.OrderBy(t => t.Location== 'Loc9787f85b-c953-4238-8bad-f712b6444443' ? 
1 : (t.Location== 'Loc9787f85b-c953-4238-8bad-f712b6444442' ? 2 : 3)) 

我會用這一段代碼來檢索位置:

List<String> Location = CustomerService.GetAllLocation(); 

我試圖用這個列表值訂購。是否可以通過使用包含列值的列表來實現動態順序?

+0

我將檢索使用這段代碼的位置:列表 Location = CustomerService.GetAllLocation(); 我想通過使用這個列表值進行排序。 – 2014-12-05 11:54:04

回答

0

使用

List<String> locations = CustomerService.GetAllLocation(); 
var ordered = tbl.OrderBy(t => locations.Contains(t.Location) ? 0 : 1); 

,或者,如果索引應代表的優先級:

var ordered = tbl 
    .Where(t => locations.Contains(t.Location)) 
    .ToList() //because List.IndexOf is not supported in LINQ-TO-SQL 
    .OrderBy(t => locations.IndexOf(t.Location)); 
+0

感謝您的回覆。是的,索引是重中之重。 解決方案#1似乎沒有正確實施順序。我與訂單有差異,但與linq分頁一起工作。解決方案#2 這對我有用。目前,我已經使用skip和take實現了linq分頁。 使用這段代碼,我最終從表中檢索所有行並通過後續實現順序。 有沒有可能通過使用跳過和採取與字符串和linq分頁列表實現兩個訂單? – 2014-12-05 12:46:05

+0

@DuraiPandian:第一個只知道1或0,所以你有兩個組。後者按列表中項目的索引進行排序。由於LINQ-TO-SQL不支持LINQ-TO-SQL,因此我已將查詢物化爲列表。但由於首先應用了過濾器,因此性能應該可以接受(取決於匹配的數量)。 Skip和Take也適用於LINQ-TO-Objects(在ToList之後)。我還沒有時間去尋找一種可以在數據庫中工作的方法,也許你需要先將它插入臨時表中。 – 2014-12-05 13:10:24

+0

非常感謝。後者的順序完全適合我。 – 2014-12-05 13:23:02

0

相反出推邏輯的方法,像這樣:

var temp = tbl.OrderBy(t => GetOrder(t)); 

public int GetOrder(LocationObject t) 
{ 
    int returnValue = 0; 
    if (t.Location== "Loc9787f85b-c953-4238-8bad-f712b6444443") 
    { 
    returnValue = 1; 
    } 
    else if (t.Location == "Loc9787f85b-c953-4238-8bad-f712b6444442") 
    { 
    returnValue = 2; 
    } 
    else 
    { 
    returnValue = 3; 
    } 
    return returnValue; 
} 
+0

我收到一個異常「LINQ to Entities does not recognized the method'Int32 GetOrder(LocationObject)'method,this method can not be translated into a store expression。」 另外,我有位置值列表,我試圖循環周圍有點通過查詢生成順序。 – 2014-12-05 12:22:45

+0

'LocationObject'作爲一個類型被認爲是任何類型't'實際上是一個佔位符(你從來沒有在你的代碼中指定它)。 – toadflakz 2014-12-05 12:31:43