C# 当只指定列的子集时,为什么MigrationHistory会导致Linq结果不同?

C# 当只指定列的子集时,为什么MigrationHistory会导致Linq结果不同?,c#,sql,linq,entity-framework,linqpad,C#,Sql,Linq,Entity Framework,Linqpad,我正在对实体框架运行一个查询,如下所示: var results = MyViewEntity.Where(row => row.someId == myTargetId); 这里,MyViewEntity表示数据库中的一个视图。对于结果,我希望有两行,其中只有一列中的值应该不同。实际结果有两行,但所有列都包含相同的值 现在如果我改变我的查询如下 MyViewEntity.Where(row => row.someId == myTargetId) .Sel

我正在对实体框架运行一个查询,如下所示:

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(…)。选择(…)


额外信息(SQL):

WHERE 123 = [Extent1].[SomeId]
WHERE 1234 = [Extent1].[SomeId]
我尝试使用LinqPad解决这个问题,它为每个LINQ表达式生成以下SQL。sql显然不同,但原因以及它的确切含义对我来说仍然不清楚。实体框架中是否发生了某种缓存,这会弄乱我的结果?可能与迁移历史有关

Where()。选择():

SELECT 
[Extent1].[MyTargetColumnName] AS [MyTargetColumnName], 
[Extent1].[SomeOtherCol] AS [SomeOtherCol], 
[Extent1].[ThirdColumn] AS [ThirdColumn]
FROM [dbo].[MyViewNameInDb] AS [Extent1]
WHERE 123 = [Extent1].[SomeId]
其中():
注意:作为纯SQL单独运行最后一部分(最终select语句)会返回两行不同的数据,这与预期的一样。但是,作为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()处。选择()
SQL脚本:

WHERE 123 = [Extent1].[SomeId]
WHERE 1234 = [Extent1].[SomeId]
Where()
SQL脚本:

WHERE 123 = [Extent1].[SomeId]
WHERE 1234 = [Extent1].[SomeId]

哎呀,这是我在这里提出的问题中的一个错误,但绝对不是我实际代码中存在差异的原因。对不起,这里有点混乱,我已经更新了我的问题。我很确定真正的问题与迁移历史有关,尽管我不太明白如何或为什么..如何验证得到两行值相同或两行不同?您是在调试器中查看变量,还是编写了这样或那样的代码?我已经运行了集成测试,调用了返回这些值的代码,并通过在LinqPad中运行查询再现了相同的效果。