晚上好。 我在使用 EFCore(Pomelo EF 8、.NET 8)进行查询时遇到问题。 调用查询的代码如下:
List<SelectListItem> retmodel = await dbContext.Certifications
.Where(c => brevettiChePuoEmettere.Contains(c.Id) && c.Attivo == 1)
.OrderByDescending(c => c.Livello).ThenBy(c => c.Descrizione)
.Select(c => new SelectListItem { Value = c.Id.ToString(), Text = c.Descrizione, Selected = c.Id == selected })
.Distinct()
.ToListAsync();
输出查询为:
SELECT DISTINCT CAST(`t`.`Id` AS char) AS `Value`, `t`.`Descrizione` AS `Text`, `t`.`Id` = @__selected_1 AS `Selected`
FROM `t_certifications` AS `t`
WHERE `t`.`Id` IN (2, .........) AND (`t`.`Attivo` = 1)
我的 order by 条款去哪儿了? 我还尝试更改 Fluent API 中的顺序,但没有任何改变。 感谢任何可以提供建议的人。
我发现了这些 EF Core GitHub 问题:
从这些我了解到,在这种情况下,
.OrderBy()
调用被“丢弃”(即它不会被转换为SQL代码),因为SQL Server在某些情况下不允许存在ORDER BY,而在其他情况下如果存在的话会忽略它。
不幸的是,EF Core 内部的丢弃悄然发生。部分讨论是关于当
.OrderBy()
后面跟着 .Distinct()
时 EF 是否应该打印警告或抛出异常。
在大多数情况下修复应该很简单:先执行
.Distinct()
,然后执行 .OrderBy()
。