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中运行查询再现了相同的效果。