【问题标题】:Why is MigrationHistory causing Linq results to differ when specifying only a subset of columns?为什么在仅指定列的子集时 MigrationHistory 会导致 Linq 结果不同?
【发布时间】:2013-11-29 15:33:56
【问题描述】:

我正在对实体框架运行如下查询:

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

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

现在,如果我将查询更改如下...

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 明显不同,但是我仍然不清楚其原因,以及它的确切含义。实体框架中是否发生了某种缓存,这会弄乱我的结果?也许与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]

【问题讨论】:

  • 你如何验证你得到两行具有相同值或两行不同的行?您是在调试器中查看变量,还是编写过以一种或另一种方式体验的代码?
  • 我已经运行了调用返回这些值的代码的集成测试,并通过在 LinqPad 中运行查询重现了相同的效果。

标签: c# sql linq entity-framework linqpad


【解决方案1】:

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

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

WHERE 123 = [Extent1].[SomeId]

Where() SQL 脚本处:

WHERE 1234 = [Extent1].[SomeId]

【讨论】:

  • 糟糕,这是我的问题中的一个错误,但绝对不是我的真实代码存在差异的原因。很抱歉这里的混乱,我现在已经更新了我的问题。我很确定真正的问题与迁移历史有关,尽管我不太明白如何或为什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
相关资源
最近更新 更多