2011-07-01 37 views
0

我有以下查詢。有沒有簡單的方法可以按RowKey的數字順序排列結果 。目前RowKey是一個字符串。我想排序_rowData,而不是修改這個查詢,因爲我想嘗試一些不同的排序順序,我在尋找一行更改,而不是重做查詢。我如何排序LINQ查詢的結果

var _rowData = (from qu in _que.GetAll(
    u => u.PartitionKey == partitionKey) 
    select new { 
    qu.PartitionKey, 
    qu.RowKey, 
    qu.Style, 
    qu.ShortTitle, 
    ModifiedToString = String.Format("{0:MM/dd/yyyy HH:mm}", qu.Modified) 
}); 

我想在LINQ查詢之外進行排序。原因是實際上我希望能夠讓用戶選擇一種RowKey,ModifiedToString和ShortTitle。

回答

1

當你使用OrderBy擴展,你不修改原始查詢,它只是枚舉相同的值:

var _rowData = ... 
var _rowDataSortedByRowKey = _rowData.OrderBy(u => u.RowKey); 
var _rowDataSortedByModifiedToString = _rowData.OrderBy(u => u.ModifiedToString); 
var _rowDataSortedByShortTitle = _rowData.OrderBy(u => u.ShortTitle); 
var _rowDataSortedByOther = _rowData.OrderBy(...); 
0

您可以使用關鍵字orderby訂購LINQ查詢的元素:

排序依據 - 簡單的2

此示例使用排序依據排序按長度單詞的列表。

public void Linq29() 
{ 
    string[] words = { "cherry", "apple", "blueberry" }; 

    var sortedWords = 
     from w in words 
     orderby w.Length 
     select w; 

    Console.WriteLine("The sorted list of words (by length):"); 
    foreach (var w in sortedWords) 
    { 
     Console.WriteLine(w); 
    } 
} 

字(按長度)的排序列表:

 
apple 
cherry 

您還可以使用Enumerable.OrderBy Extension Method

var sortedWords = words.OrderBy(w => w.Length); 

如果你想用不同的標準來訂購,你可以爲每個標準通過不同的按鍵選擇器:

if (c == "Length") 
    sortedWords = words.OrderBy(w => w.Length); 
else 
    sortedWords = words.OrderBy(w => w); 
+0

對不起,但我想在LINQ查詢之外做到這一點。原因是實際上我希望能夠讓用戶選擇一種RowKey,ModifiedToString和ShortTitle。上述查詢後,我想這可能是三種不同的度假村選項。 –

+0

@Robert Dawson:然後使用第一個查詢作爲輸入進行第二個查詢? 'var query = from x _rowData orderby x。RowKey選擇x;' – dtb

+0

謝謝dtb。我認爲這是我想要的解決方案。只是一個問題。如何更改字符串,以便我可以按數字排序。目前第9行來自第80行。 –

0

這裏亞去:

_rowData.Sort((a, b) => Convert.ToInt32(a.Key).CompareTo(Convert.ToInt32(b.Key))); 
0

嘗試在鮮明的語句中指定DataRowComparer.Default。

例子:

var query = (from c in functiongettable().AsEnumerable() 
      orderby c.Field<string>("Name") 
      select c).Distinc(DataRowComparer.Default); 
+0

DataRowComparer?對不起,那是什麼?我正在使用RowKey,它是數字rowid的字符串表示形式。 –

0

您可以使用System.Linq.Enumerable.OrderByDescending()

喜歡的東西:

(from qu in _que.OrderByDescending(u => u.RowKey).GetAll(
    u => u.PartitionKey == partitionKey) 
0

嘗試使用排序依據擴展方法在System.Linq的命名空間:

http://msdn.microsoft.com/en-us/library/bb549264.aspx

此方法將允許您添加訂貨到您的查詢條件。

var _rowData = (from qu in _que.GetAll(
    u => u.PartitionKey == partitionKey) 
    select new { 
    qu.PartitionKey, 
    qu.RowKey, 
    qu.Style, 
    qu.ShortTitle, 
    ModifiedToString = String.Format("{0:MM/dd/yyyy HH:mm}", qu.Modified) 
}); 

// Let's say the user has selected they want to sort by RowKey 
// and ModifiedToString, but not ShortTitle. 
bool sortByRowKey = true; 
bool sortByModifiedToString = true; 
bool sortByShortTitle = false; 

var query = _rowData.AsQueryable(); 

if(sortByRowKey) { 
    query = query.OrderBy(x => x.RowKey); 
} 

if(sortByModifiedToString) { 
    query = query.OrderBy(x => x.ModifiedToString); 
} 

if(sortByShortTitle) { 
    query = query.OrderBy(x => x.ShortTitle); 
} 

// Now let's call ToList() to execute the query and get the ordered data. 
var _orderedData = query.ToList();