如何使用 Hotchocolate 和 EF Core 指定默认排序?

Pet*_*err 3 entity-framework-core hotchocolate

有没有办法添加默认排序字段,以便我可以UsePagingUserSorting,但如果没有指定顺序,我会添加一个字段,例如 Id。但如果用户确实指定了顺序,则不要添加默认值。

例如,我可以将默认排序添加到查询方法中,但其他排序不起作用

[UseContext]
[UsePaging]
[UseProjection]
[UseFiltering]
[UseSorting]
public IQueryable<Property> GetProperties([ScopedService] PropContext dbContext)
{
    return dbContext.Properties
                    .OrderBy(p => p.Id); // Default sort by Prop Id
} 
Run Code Online (Sandbox Code Playgroud)

如果没有排序,实体框架会显示警告:

该查询使用行限制运算符(“Skip”/“Take”),而不使用“OrderBy”运算符。
这可能会导致不可预测的结果

我看到了一些意想不到的结果

Pet*_*err 5

感谢 S Blomstrand

使用这些扩展方法

public static bool HasOrderByArgument(this IResolverContext context,
                                       string argumentName = "order")
{
    try
    {
        var orderByArgument = context.ArgumentLiteral<IValueNode>(argumentName);
        if (orderByArgument != NullValueNode.Default && orderByArgument != null)
        {
            return true;
        }
    }
    catch
    {
        return false;
    }

    return false;
}

public static IQueryable<T> OrderByArgumentOrDefault<T>(this IQueryable<T> query, IResolverContext context, 
                                                        Func<IQueryable<T>> func, string argumentName = "order")
{
    if (context.HasOrderByArgument(argumentName))
    {
        return query;
    }

    return func.Invoke();
}
Run Code Online (Sandbox Code Playgroud)

然后可以按如下方式调用它:

[UseContext]
[UsePaging]
[UseProjection]
[UseFiltering]
[UseSorting]
public IQueryable<Property> GetProperties([ScopedService] PropContext dbContext)
{
    return dbContext.Properties
                    .OrderByArgumentOrDefault(context, () => properties.OrderBy(p => p.Id));
} 
Run Code Online (Sandbox Code Playgroud)