gpt4 book ai didi

c# - 检索数据,奇怪的行为

转载 作者:太空狗 更新时间:2023-10-30 00:48:25 25 4
gpt4 key购买 nike

我正在使用 EF 6 从 SQL Server 检索一些数据。我过去遇到过这个问题,但我没有问过任何人。

对于下面的代码,只关注选择。

假设在数据库中我有 2 行:

1 2 3 4  5 
6 7 8 9 10

我的代码:

 var results = db.Table.Where(o => o.Version == 1)
.Select(o => new List<double?>{ o.M01, o.M02, o.M03, o.M04, o.M05});

return results.ToList();

上面的代码将返回一个包含以下列表的列表:

previousDemand[0] = 1 2 3 4 5
previousDemand[1] = 10 9 8 7 6

第二个列表是相反的。

如果我有更多的行,它会发生相同的情况:第一个正常,第二个反转,第三个正常,第四个反转等等。

如果我把代码改成这样:

 var results = db.Table.Where(o => o.Version == 1).ToList();
var x = results.Select(o => new List<double?>{ o.M01, o.M02, o.M03, o.M04, o.M05});

return x.ToList();

一切都会在这里正常工作。

如果我在 EF 查询中创建列表似乎有问题。

我是不是漏掉了什么重要的东西?

更新添加一些截图: Sql Server

What i receive in EF

最佳答案

长话短说

new List<double?> { o.M01, o.M02, o.M03, o.M04, o.M05 }.OrderBy(p => p).ToList()

正如 @GertArnold 在评论中指出的那样,该建议仅适用于您提供的示例,但不能解决您的问题。

您可以做的不是查询列表,而是返回一个包含您想要的列的新实体。将结果具体化后,您可以将其转换为列表。

var results = 
db.Entities.Where(o => o.Version == 1)
.Select(o => new { M01 = o.M01, M02 = o.M02, M03 = o.M03, M04 = o.M04, M05 = o.M05 });

return results.Select(o => new List<double?> { o.M01, o.M02, o.M03, o.M04, o.M05 });

现在推理:

您的 EF 查询生成以下(非常困惑)SQL 语句:

SELECT 
[Project6].[Id] AS [Id],
[Project6].[C2] AS [C1],
[Project6].[C1] AS [C2]
FROM (
SELECT
CASE
WHEN ([UnionAll4].[C1] = 0) THEN [Extent1].[M01]
WHEN ([UnionAll4].[C1] = 1) THEN [Extent1].[M02]
WHEN ([UnionAll4].[C1] = 2) THEN [Extent1].[M03]
WHEN ([UnionAll4].[C1] = 3) THEN [Extent1].[M04]
ELSE [Extent1].[M05] END AS [C1],
[Extent1].[Id] AS [Id],
1 AS [C2]
FROM [dbo].[Entities] AS [Extent1]
CROSS JOIN (
SELECT 0 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT 1 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]
UNION ALL
SELECT 2 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable3]
UNION ALL
SELECT 3 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable4]
UNION ALL
SELECT 4 AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable5]
) AS [UnionAll4]
WHERE 1 = [Extent1].[Version]
) AS [Project6]
ORDER BY [Project6].[Id] ASC, [Project6].[C2] ASC

正如您在 ORDER BY 子句中看到的那样,查询按 [Project6].[C2] 排序,这只是一个返回 1 的控制标志。这是因为,正如@marc_s 在评论中指出的那样,您没有明确指定结果的顺序。

如果您改为使用 somenting,例如:

变量结果 = db.Entities.Where(o => o.Version == 1) .Select(o => new List { o.M01, o.M02, o.M03, o.M04, o.M05 }.OrderBy(p => p).ToList());

... 那么生成的 SQL 将包含正确的 order 子句,您将获得预期的结果。

var results = 
db.Entities.Where(o => o.Version == 1)
.Select(o => new { M01 = o.M01, M02 = o.M02, M03 = o.M03, M04 = o.M04, M05 = o.M05 });

return results.Select(o => new List<double?> { o.M01, o.M02, o.M03, o.M04, o.M05 });

...那么您就不需要为生成的 SQL 顺序而烦恼,并且可以控制您的列在输出列表中返回的顺序。

关于c# - 检索数据,奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46891601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com