Collection Initializer在linq select中以错误的顺序添加项目

时间:2014-03-11 15:03:55

标签: c# linq entity-framework

我正在尝试从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();

3 个答案:

答案 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; }
}