2011-07-01 39 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();