C# 不区分大小写的排序不起作用(.NET Core,EF)

C# 不区分大小写的排序不起作用(.NET Core,EF),c#,.net,sorting,entity-framework-core,C#,.net,Sorting,Entity Framework Core,我想以不区分大小写的方式对从Postgresql数据库检索的项目列表进行排序 假设我有以下未排序的值:A,B,A,c,B,c 我想要:A,A,B,B,C,C 但现在我得到:A,B,C,A,B,C 我是否在此处使用StringComparison.OrdinalIgnoreCase错误 谢谢你的帮助和提示 public class SortingInfo { public string SortColumn { get; set; } public SortOrder SortOr

我想以不区分大小写的方式对从Postgresql数据库检索的项目列表进行排序

假设我有以下未排序的值:
A,B,A,c,B,c

我想要:
A,A,B,B,C,C

但现在我得到:
A,B,C,A,B,C

我是否在此处使用StringComparison.OrdinalIgnoreCase错误

谢谢你的帮助和提示

public class SortingInfo
{
    public string SortColumn { get; set; }
    public SortOrder SortOrder { get; set; }
}

public Task<List<MyCustomType>> GetItemsAsync(SortingInfo sortingInfo)
{
    var items = _itemsRepo
        .Query
        .ApplySort(sortingInfo)
        .ToList();

    var mappedData = _mapper.Map<List<Entities.MyCustomType>, List<MyCustomType>>(items);

    return Task.FromResult(mappedData);
}
公共类排序信息
{
公共字符串SortColumn{get;set;}
公共排序器排序器{get;set;}
}
公共任务GetItemsAsync(排序信息排序信息)
{
var items=\u itemsRepo
查询
.ApplySort(分类信息)
.ToList();
var mappedData=_mapper.Map(项目);
返回Task.FromResult(mappedData);
}
公共静态IQueryable ApplySort(此IQueryable查询,排序信息排序信息)
{
var propertyInfos=typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
var objectProperty=propertyInfos.FirstOrDefault(p=>
p、 Name.Equals(sortingInfo.SortColumn.Trim(),StringComparison.OrdinalIgnoreCase));
if(objectProperty==null)
{
返回查询;
}
var sortingOrder=sortingInfo.SortOrder==SortOrder.Asc
?“上升”
:“下降”;
返回query.OrderBy($“{objectProperty.Name}{sortingOrder}”);
}
您是否尝试按“上限”订购


return query.OrderBy($“{objectProperty.Name}{sortingOrder}”)中的
objectProperty.Name
替换为
objectProperty.Name.ToUpper()

我怀疑您以这种方式订购商品的原因是您的订单

您可以强制执行不区分大小写的查询,也可以强制执行查询并在代码中排序:

公共静态IEnumerable ApplySort(此IQueryable查询,排序信息排序信息)
{
var propertyInfos=typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
var objectProperty=propertyInfos.FirstOrDefault(p=>
p、 Name.Equals(sortingInfo.SortColumn.Trim(),StringComparison.OrdinalIgnoreCase));
if(objectProperty==null)
{
返回查询;
}
var param=表达式参数(typeof(T));
LambdaExpression lambda=Expression.lambda(Expression.Property(param,sortingInfo.SortColumn),param);
var materialisedQuery=query.ToList();//这将强制执行查询!
var orderByMethod=sortingInfo.SortOrder==SortOrder.Asc
?typeof(Enumerable).GetMethods().First(m=>m.Name==“OrderBy”&&m.GetParameters().Count()==2)
:typeof(Enumerable).GetMethods().First(m=>m.Name==“OrderByDescending”&&m.GetParameters().Count()==2);
orderByMethod=orderByMethod.MakeGenericMethod(typeof(T),objectProperty.PropertyType);
返回Expression.Lambda(Expression.Call(orderByMethod,Expression.Constant(materialisedQuery),Lambda)).Compile();
}
通过EF强制排序可能会很痛苦(如果可能的话-我不确定它是否允许您这样做)

有一个参数用于对数据库中代码vs中的最终数据集进行排序:

  • 一方面,您可以更轻松地向外扩展代码(RDBMS不能很好地向外扩展,并且在向上扩展时存在限制)
  • 但根据您的数据,您可能会发现提供订单有助于SQL制定更好的执行计划

什么是构建SQL查询?这是在哪个数据库引擎上运行的?您确定不是Automapper更改了顺序吗?您是否检查了
项目的顺序?
public static IQueryable<T> ApplySort<T>(this IQueryable<T> query, SortingInfo sortingInfo)
{
    var propertyInfos = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
    var objectProperty = propertyInfos.FirstOrDefault(p =>
        p.Name.Equals(sortingInfo.SortColumn.Trim(), StringComparison.OrdinalIgnoreCase));

    if (objectProperty == null)
    {
        return query;
    }

    var sortingOrder = sortingInfo.SortOrder == SortOrder.Asc
        ? "ascending"
        : "descending";

    return query.OrderBy($"{objectProperty.Name} {sortingOrder}");
}