集合初始化器在linq选择中以错误的顺序添加项



我试图从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; }
}

相关内容

  • 没有找到相关文章