【发布时间】:2021-08-04 18:18:50
【问题描述】:
我有一个问题:
public async Task<IEnumerable<CategoryDto>> GetCategoriesAsync()
{
var dto = await _context.Categories.FromSqlRaw(
@"SELECT * FROM [cp].[GetCategoryTree]")
.ProjectTo<CategoryDto>(_mapper.ConfigurationProvider)
.AsNoTrackingWithIdentityResolution()
.ToListAsync();
return dto;
}
它产生这个 sql:
SELECT [c].[banner_group_id], [c].[category_id], [c].[description], [c].[inactive], [c].[issitecategory], [c].[keywords], [c].[category_name], [c].[page_content], [c].[parent_category_id], [c].[sort_order], [c].[title], [b].[banner_group_id], [b].[category_id], [b].[description], [b].[inactive], [b].[issitecategory], [b].[keywords], [b].[category_name], [b].[page_content], [b].[parent_category_id], [b].[sort_order], [b].[title]
FROM (
SELECT * FROM [cp].[GetCategoryTree]
) AS [c]
LEFT JOIN [bma_ec_categories] AS [b] ON [c].[category_id] = [b].[parent_category_id]
ORDER BY [c].[category_id], [b].[category_id]
[cp].[GetCategoryTree] 的输出已在该视图中排序。为什么 EF Core 最后要添加一个额外的ORDER BY?我可以告诉 EF Core 不排序吗?
【问题讨论】:
-
奇怪...是 Automapper 的 ProjectTo 吗?您可以删除它并记录您的查询吗?
-
@GHDevOps 是的,就是这么做的。
-
映射到
CategoryDto导致加入,我看到当 EF-core 加入时它总是按 PK 值添加排序,可能是为了使后处理更容易(在内存中构建对象)。 -
视图没有排序,什么意思它已经排序了?
-
不,他们不能,这只是一个能够将单词
ORDER BY放在视图中的黑客,这仅意味着TOP在排序后被评估,它没有 我重复 DOES NOT 对外部查询强制执行任何排序,这是一个完整的神话。见stackoverflow.com/a/15188437/14868997和mssqltips.com/sqlservertip/4488/…和bengribaudo.com/blog/2015/05/01/3430/…和dba.stackexchange.com/a/21437/220697