新字符串列表在LINQ中初始化时清洗列表元素的顺序

时间:2016-10-07 00:08:55

标签: c# asp.net entity-framework linq list

在使用我的ASP.NET 5 API项目遇到一些挫折后,我决定将其重建为较旧的WebApi 2项目。我试图从LINQ查询生成2个字符串的集合列表(最初是2个元素字符串数组的列表,现在是字符串列表的列表)。

这是我想在ASP.NET 5项目中使用的伪代码:

var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new string[] { x.Number.Trim(), x.Name.Trim() }).ToList();

新项目对查询感到窒息,因为它无论出于何种原因都不喜欢使用字符串数组(我假设EF 6与7有差异?)。作为一个修复,我改为让查询返回一个字符串列表列表,但它混合了" Number"的顺序。和"姓名"它返回的字段,有时Number是第一个元素,有时是Name。这是我试过的一些新的查询代码尝试,所有这些都是以混乱的元素顺序结束的:

var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new List<string> { x.Number.Trim(), x.Name.Trim() }).ToList();
var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => (new string[2] { x.Number.Trim(), x.Name.Trim() }).ToList()).ToList();
var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new List<string>(new string[] { x.Number.Trim(), x.Name.Trim() })).ToList();

我意识到有很多不同的方法可以让我找到最终结果,但我希望有人可以帮助我理解为什么这些列表元素会以不同的顺序放在列表中(有时名称然后编号其他次数编号然后名称),即使我根据新创建的数组生成一个列表,该数组以前完全保留了订单。

1 个答案:

答案 0 :(得分:2)

我很想知道为这些查询生成了什么SQL,以及在结果发生变化时它是否会发生变化。选择一个列表对我来说似乎是一个非常罕见的情况,所以你可能遇到一个边缘情况(或至少进入未定义的行为领域)。

由于您基本上只是选择了两列,我们可以担心在实体框架完成工作后数据的结构

db.MyTable.Where(x => [WHERE Clauses])
    .Select(x => new { Number = x.Number.Trim(), Name = x.Name.Trim() })
    .AsEnumerable() //Force EF to materialize the result here
    .Select(x => new List<string> { x.Number, x.Name }) //Manipulate the result in memory
    .ToList();
相关问题