我试图从IQueryable对象中获得列表列表。表看起来像
prop_A | prop_B | sort_order
A | Apple | 1
B | Bat | 2
C | Crane | 3
db.table.Select(x => new List<string>() { x.prop_a, x.prop_b}).ToList();
返回[[A, Apple], [B, Bat], [C, Crane]]
但是一旦我加入order子句
db.table.OrderBy(x => x.sort_order).Select(x => new List<string>() { x.prop_a, x.prop_b}).ToList();
内部列表的顺序似乎是随机的。例:[[A, Apple], [Bat, B], [Crane, C]]
有谁知道这是为什么,我能做些什么来解决它吗?
编辑
就像下面提到的,我的问题是IQueryable对象没有排序。我最终分两步完成了这个任务。
var foo = db.table.OrderBy(x => x.sort_order).AsEnumerable();
var bar = foo.Select(x => new List<string>() { x.prop_a, x.prop_b}).ToList();
在IQueryable上执行Select操作时,不保留顺序。如果在IEnumerable上执行Select,那么顺序将被保留。
编辑
order和Select的调用顺序无关
您应该在末尾使用您想要排序的字段指定OrderBy。
作为一个例子,如果您想按prop_a排序,请尝试以下操作:
db.table.Select(x => new List<string>() { x.prop_a, x.prop_b}).OrderBy(x => x.prop_a).ToList();
编辑:经确认,db是IQueryable类型。这种类型不保留顺序,在本例中OrderBy应该位于末尾
我在调试模式下用以下代码检查了您的情况,一切正常。没什么特别的。
var items = new List<Item>
{
new Item
{
prop_a = "A", prop_b = "Apple", sort_order = 1
}, new Item
{
prop_a = "B", prop_b = "Bat", sort_order = 2
}, new Item
{
prop_a = "C", prop_b = "Crane", sort_order = 3
},
};
var list1 = items.Select(x => new List<string> {x.prop_a, x.prop_b}).ToList();
var list2 = items.OrderBy(x => x.sort_order).Select(x => new List<string> {x.prop_a, x.prop_b}).ToList();
Item
类如下:
public class Item
{
public string prop_a { get; set; }
public string prop_b { get; set; }
public int sort_order { get; set; }
}