选择多列时,我没有看到关于
Distinct
生成的预期 SQL。 特别是 Distinct
被排除在生成的 SQL 之外。 奇怪的是,当我的 Select
子句只有 1 列时,这似乎可以正常工作。 选择多列时,如何使用实体框架实现 Distinct
SQL 查询? 当键为多列时,Group By
也不起作用。
在这些例子中,“e”是我的
System.Data.Entity.DbContext
。
选择多列的查询会忽略不同的:
var distinct1 = e.MyViews
.Select(a => new { a.Col1, a.Col2, a.Col3, })
.Distinct()
.ToList();
生成的 SQL 丢失
Distinct
:
SELECT
[Extent1].[Col1] AS [Col1],
[Extent1].[Col2] AS [Col2],
[Extent1].[Col3] AS [Col3]
FROM
(SELECT
[MyView].[Col1] AS [Col1],
[MyView].[Col2] AS [Col2],
[MyView].[Col3] AS [Col3],
[MyView].[UserId] AS [UserId]
FROM
[MySchema].[MyView] AS [MyView]) AS [Extent1]
选择单列的查询使用
Distinct
:
var distinct2 = e.MyViews
.Select(a => new { a.Col1, })
.Distinct()
.ToList();
生成的 SQL 正确包含
Distinct
:
SELECT
[Distinct1].[C1] AS [C1],
[Distinct1].[Col1] AS [Col1]
FROM
(SELECT DISTINCT
[Extent1].[Col1] AS [Col1],
1 AS [C1]
FROM
(SELECT
[MyView].[Col1] AS [Col1],
[MyView].[Col2] AS [Col2],
[MyView].[Col3] AS [Col3],
[MyView].[UserId] AS [UserId]
FROM
[MySchema].[MyView] AS [MyView]) AS [Extent1]) AS [Distinct1]
请注意,它在 .Net Framework 4.8 上运行,并且是原始的 EF 6,而不是 EF Core。
针对 SQL Server(Azure SQL 数据库托管实例)运行。
我已经确认 EF Core 在生成的 SQL 中正确注入了 Select 中的多列的 Distinct,但这并不能真正帮助我完成我的 .Net Framework 项目。
更新
我现在发现 Select 子句中的某些列组合确实有效,而其他组合则不起作用,但我无法确定差异因素是什么。
Select 中的这些列组合确实会在 SQL 中产生 Distinct:
第 1 栏
第 2 栏
第 3 栏
第 1 列,第 2 列
第 2 栏,第 3 栏
Select 中的这些列组合不会在 SQL 中产生 Distinct:
第 1 列,第 3 列
第 1 列、第 2 列、第 3 列
我也遇到了同样的问题 Wwe 更改了执行与 EF 不同的视图,使可为空的列不可为空。 这使得新的不可为空列成为视图的“主键”,从而实现不同的工作。我们的想法是,由于 EF 认为我们选择的列是所有主键,因此没有正确应用不同值。