【发布时间】:2017-02-15 21:00:54
【问题描述】:
在我的 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 存在差异?),查询被阻塞了。作为修复,我让查询返回一个字符串列表,但它混淆了它返回的“数字”和“名称”字段的顺序,有时数字是第一个元素,有时是名称。这是我尝试的一些新的查询代码尝试,所有这些都以混乱的元素顺序结束:
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();
我意识到有很多不同的方法可以得到我正在寻找的最终结果,但我希望有人能帮助我理解为什么这些列表元素会以不同的顺序放置在列表中(有时是名称然后是编号其他时候是数字然后是名称),即使我基于新创建的数组生成了一个列表,该数组之前完美地保留了顺序。
【问题讨论】:
-
这似乎不太可能。您确定您的数据正确吗?你能重现这个吗?每次都是相同的行错误吗?如果你在
Select之前加上.ToList().会发生什么? -
正如 Blorgbeard 所说,数据似乎更可能不正确。但是,我认为选择数组或列表对于 EF 来说是非常罕见的情况。也许你确实找到了一个边缘案例。试试这个:
var testList = db.MyTable.Where(x => [WHERE Clauses]).Select(x => new { Number = x.Number.Trim(), Name = x.Name.Trim() }).AsEnumerable().Select(x => new List<string> { x.Number, x.Name }).ToList();。这将导致在 EF 完成其工作之后构建列表。如果这仍然产生不正确的值,您几乎可以肯定这是因为数据不正确。 -
数据绝对正确,是我们Great Plains 2015 ERP软件的主客户表中的客户记录,这里的不良数据会对整个公司造成严重破坏,我当然会听说,加上它与原始字符串数组代码完美配合。 @Rob您的建议解决了这个问题,无论出于何种原因在LINQ查询修复它之后构建列表,将其发布为答案,如果您愿意,我会接受它。仍然希望我知道发生了什么,但我会把工作代码当作胜利,谢谢!
标签: c# asp.net entity-framework linq list