首页 > 解决方案 > Entity Framewrok 6.2.0 Table-Per-Hierarchy 继承奇怪的查询生成时按类型过滤

问题描述

我已经为一个项目创建了一个 TPH,对其进行了配置,并且在 EF 6 上一切正常,但是我注意到有一次当我按类型过滤时生成的查询:

var existingTransaction = ctx.Transactions.Where(tr => tr.BalanceId == 1 && ids.Contains(tr.ParticipationId) && tr is DepositTransaction);

这会生成以下查询:

SELECT 
[Extent1].[TransactionType] AS [TransactionType], 
[Extent1].[Id] AS [Id], 
[Extent1].[BalanceId] AS [BalanceId], 
[Extent1].[ParticipationId] AS [ParticipationId], 
[Extent1].[Name] AS [Name], 
[Extent1].[TransactionAmount] AS [TransactionAmount]
FROM [dbo].[Transactions] AS [Extent1]
WHERE ([Extent1].[TransactionType] IN (1,2,4,3)) AND (1 = [Extent1].[BalanceId]) AND ([Extent1].[ParticipationId] IN (1, 2, 3, 4, 5)) AND ([Extent1].[TransactionType] = 2)

注意事务类型的部分,它包含了所有配置的事务类型,虽然查询在语义上是正确的,但很奇怪。当我删除其他过滤器并仅按类型保留过滤器时:

var existingTransaction = ctx.Transactions.Where(tr => tr is DepositTransaction);

查询看起来像预期的那样:

SELECT 
'0X0X' AS [C1], 
[Extent1].[Id] AS [Id], 
[Extent1].[BalanceId] AS [BalanceId], 
[Extent1].[ParticipationId] AS [ParticipationId], 
[Extent1].[Name] AS [Name], 
[Extent1].[TransactionAmount] AS [TransactionAmount]
FROM [dbo].[Transactions] AS [Extent1]
WHERE [Extent1].[TransactionType] = 2

那么,为什么第一个是这样的呢?

标签: c#entity-framework

解决方案


推荐阅读