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)
在生成的 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)