C# 不区分大小写的排序不起作用(.NET Core,EF)
我想以不区分大小写的方式对从Postgresql数据库检索的项目列表进行排序 假设我有以下未排序的值: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
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}");
}