gpt4 book ai didi

c# - 为什么仅指定列的子集时 MigrationHistory 会导致 Linq 结果不同?

转载 作者:太空狗 更新时间:2023-10-29 23:46:03 25 4
gpt4 key购买 nike

我正在对 Entity Framework 运行查询,如下所示:

var results = MyViewEntity.Where(row => row.someId == myTargetId);

这里,MyViewEntity代表数据库中的一个 View 。对于结果,我期望两行中只有一列中的值应该不同。实际结果有两行,但所有列都包含相同的值。

现在,如果我按如下方式更改查询...

MyViewEntity.Where(row => row.someId == myTargetId)
.Select(row => row.MyTargetColumnName);

... 结果将包含两个不同的值,正如我最初预期的那样。如下添加额外的列仍会返回两行,但预期的列有所不同:

MyViewEntity.Where(row => row.SomeId == myTargetId)
.Select(row => new {
row.MyTargetColumnName,
row.SomeOtherCol,
row.ThirdColumn
});

这将让我“解决”这个问题,只需在我的查询中指定大量的列。但是,我宁愿不这样做,而且我想了解是什么导致了
Where(...)Where(...).Select(...)


额外信息(SQL):

我尝试使用 LinqPad 解决这个问题,它为每个 LINQ 表达式生成以下 SQL。 sql 明显不同,但是这个原因,以及它的确切含义,我仍然不清楚。 Entity Framework 中是否发生了某种缓存,这弄乱了我的结果?也许与 MigrationHistory 有关?

Where().Select():

SELECT 
[Extent1].[MyTargetColumnName] AS [MyTargetColumnName],
[Extent1].[SomeOtherCol] AS [SomeOtherCol],
[Extent1].[ThirdColumn] AS [ThirdColumn]
FROM [dbo].[MyViewNameInDb] AS [Extent1]
WHERE 123 = [Extent1].[SomeId]

Where():
注意:作为纯 SQL 自行运行最后一部分(最终选择语句)会按预期返回两个不同的行。然而,将整个事情作为 LINQ 表达式运行,返回两个相同的行:

SELECT TABLE_SCHEMA SchemaName, 
TABLE_NAME Name FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
GO

SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[__MigrationHistory] AS [Extent1]
) AS [GroupBy1]
GO

SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[ModelHash] AS [ModelHash]
FROM [dbo].[EdmMetadata] AS [Extent1]
ORDER BY [Extent1].[Id] DESC
GO

SELECT
[Extent1].[FirstCol] AS [FirstCol],
[Extent1].[SecondCol] AS [SecondCol],
--- More clumns here, omitted for clarity..
[Extent1].[LastCol] AS [LastCol]
FROM [dbo].[MyViewNameInDb] AS [Extent1]
WHERE 123 = [Extent1].[SomeId]

最佳答案

在生成的 SQL 脚本中,您似乎传递了两个不同的参数 (myTargetId) 值,这显然应该产生不同的结果。

Where().Select() SQL 脚本中:

WHERE 123 = [Extent1].[SomeId]

Where() SQL 脚本中:

WHERE 1234 = [Extent1].[SomeId]

关于c# - 为什么仅指定列的子集时 MigrationHistory 会导致 Linq 结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20289095/

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