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

Kja*_*tan 5 c# sql linq entity-framework linqpad

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

var results = MyViewEntity.Where(row => row.someId == myTargetId);
Run Code Online (Sandbox Code Playgroud)

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

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

MyViewEntity.Where(row => row.someId == myTargetId)
            .Select(row => row.MyTargetColumnName);
Run Code Online (Sandbox Code Playgroud)

...结果将包含两个不同的值,正如我最初预期的那样.按如下方式添加其他列仍会返回两行,但预期列中存在差异:

MyViewEntity.Where(row => row.SomeId == myTargetId)
            .Select(row => new {
                                row.MyTargetColumnName, 
                                row.SomeOtherCol, 
                                row.ThirdColumn
                               });
Run Code Online (Sandbox Code Playgroud)

这将让我通过在查询中指定大量列来"修复"问题.然而,我会,不喜欢这样做,我想知道是什么原因导致的差异
Where(...)Where(...).Select(...).


额外信息(SQL):

我尝试使用LinqPad来解决这个问题,LinqPad为每个LINQ表达式生成以下SQL.sql明显不同,但其原因,以及它的含义,对我来说仍然不清楚.实体框架中是否发生了某种缓存,这会影响我的结果?MigrationHistory或许相对于?

其中()选择():

SELECT 
[Extent1].[MyTargetColumnName] AS [MyTargetColumnName], 
[Extent1].[SomeOtherCol] AS [SomeOtherCol], 
[Extent1].[ThirdColumn] AS [ThirdColumn]
FROM [dbo].[MyViewNameInDb] AS [Extent1]
WHERE 123 = [Extent1].[SomeId]
Run Code Online (Sandbox Code Playgroud)

只有Where():
注意:运行最后一部分(最终的select语句)就像纯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]
Run Code Online (Sandbox Code Playgroud)

Yai*_*vet 1

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

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

WHERE 123 = [Extent1].[SomeId]
Run Code Online (Sandbox Code Playgroud)

Where()SQL 脚本中:

WHERE 1234 = [Extent1].[SomeId]
Run Code Online (Sandbox Code Playgroud)