【发布时间】: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