我正在尝试从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]]
但是一旦我抛出orderby子句
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();
答案 0 :(得分:1)
您应该在最后使用要排序的字段指定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应该在最后
答案 1 :(得分:1)
当您在IQueryable上执行选择时,不会保留该顺序。如果在IEnumerable上执行选择,则会保留顺序。
修改强>
调用OrderBy和Select的顺序并不重要。
答案 2 :(得分:0)
我已在调试模式下使用以下代码检查了您的情况,并且所有内容都按预期工作。没什么特别的。
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; }
}