C# 使用OData在EF Core中排序不区分大小写
我在.NET Core 2.2应用程序中使用EF Core连接DB,在前端使用Angular 8。我还使用OData从API中检索一些数据 我的OData查询如下所示:C# 使用OData在EF Core中排序不区分大小写,c#,angular,entity-framework,odata,C#,Angular,Entity Framework,Odata,我在.NET Core 2.2应用程序中使用EF Core连接DB,在前端使用Angular 8。我还使用OData从API中检索一些数据 我的OData查询如下所示: https://example.com/Odata/Farmers?$count=true&$orderby=firstName%20asc&$top=10 上面的查询返回的数据排序如下: A,B,A,B 但是它应该返回如下数据(不区分大小写): A,A,B,B. 我的.NET核心API端点如下所示: [Ena
https://example.com/Odata/Farmers?$count=true&$orderby=firstName%20asc&$top=10
上面的查询返回的数据排序如下:
A,B,A,B
但是它应该返回如下数据(不区分大小写):
A,A,B,B.
我的.NET核心API端点如下所示:
[EnableQuery(HandleNullPropagation = HandleNullPropagationOption.False)]
[ODataRoute]
[AuthorizeScopes(AppScopes.FarmerListRead)]
[HttpGet]
public IQueryable<FarmerViewDto> GetAll()
{
return _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>();
}
[启用查询(HandleNullPropagation=HandleNullPropagationOption.False)]
[ODataRoute]
[授权范围(AppScopes.FarmerListRead)]
[HttpGet]
公共IQueryable GetAll()
{
返回工作单元
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
}
我在OData路由配置中发现了一个属性
enableCasensitive
,但它是用于其他内容的。我无法为我的问题找到合适的解决方案。在您返回之前
var farmerViewDto = _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>();
var returnValue = farmerViewDto.ToList().OrderBy(x => x.PropertyYouWantToSort, StringComparer.OrdinalIgnoreCase).AsQueryable();
retur returnValue;
var farmervewdto=\u unitOfWork
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
var returnValue=farmerViewDto.ToList().OrderBy(x=>x.PropertyYouWantToSort,StringComparer.OrdinalIgnoreCase).AsQueryable();
返回值;
在我的评论中添加其他信息
速度更快,但有很多代码
var searchFilter = //user input
var query = _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>().AsQueryable();
if (searchFilter == "property1")
{
query = query.OrdberBy(x => x.Property1, StringComparer.OrdinalIgnoreCase).AsQueryable();
}
if (searchFilter == "property2")
{
query = query.OrdberBy(x => x.Property2, StringComparer.OrdinalIgnoreCase).AsQueryable();
}
.....
return query;
var searchFilter=//用户输入
变量查询=\u unitOfWork
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For().AsQueryable();
如果(searchFilter==“property1”)
{
query=query.OrdberBy(x=>x.Property1,StringComparer.OrdinalIgnoreCase).AsQueryable();
}
如果(searchFilter==“property2”)
{
query=query.OrdberBy(x=>x.Property2,StringComparer.OrdinalIgnoreCase).AsQueryable();
}
.....
返回查询;
通过反射
var searchFilter = //user input
var query = _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>();
query.Where(x => x.GetType()
.GetProperty(searchFilter)
.GetValue(x).ToString(), StringComparer.OrdinalIgnoreCase).AsQueryable();
return query;
var searchFilter=//用户输入
变量查询=\u unitOfWork
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
其中(x=>x.GetType()
.GetProperty(搜索过滤器)
.GetValue(x).ToString(),StringComparer.OrdinalIgnoreCase).AsQueryable();
返回查询;
在您返回之前
var farmerViewDto = _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>();
var returnValue = farmerViewDto.ToList().OrderBy(x => x.PropertyYouWantToSort, StringComparer.OrdinalIgnoreCase).AsQueryable();
retur returnValue;
var farmervewdto=\u unitOfWork
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
var returnValue=farmerViewDto.ToList().OrderBy(x=>x.PropertyYouWantToSort,StringComparer.OrdinalIgnoreCase).AsQueryable();
返回值;
在我的评论中添加其他信息
速度更快,但有很多代码
var searchFilter = //user input
var query = _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>().AsQueryable();
if (searchFilter == "property1")
{
query = query.OrdberBy(x => x.Property1, StringComparer.OrdinalIgnoreCase).AsQueryable();
}
if (searchFilter == "property2")
{
query = query.OrdberBy(x => x.Property2, StringComparer.OrdinalIgnoreCase).AsQueryable();
}
.....
return query;
var searchFilter=//用户输入
变量查询=\u unitOfWork
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For().AsQueryable();
如果(searchFilter==“property1”)
{
query=query.OrdberBy(x=>x.Property1,StringComparer.OrdinalIgnoreCase).AsQueryable();
}
如果(searchFilter==“property2”)
{
query=query.OrdberBy(x=>x.Property2,StringComparer.OrdinalIgnoreCase).AsQueryable();
}
.....
返回查询;
通过反射
var searchFilter = //user input
var query = _unitOfWork
.FarmerViewRepository
.GetAllQueryable()
.UseAsDataSource()
.For<FarmerViewDto>();
query.Where(x => x.GetType()
.GetProperty(searchFilter)
.GetValue(x).ToString(), StringComparer.OrdinalIgnoreCase).AsQueryable();
return query;
var searchFilter=//用户输入
变量查询=\u unitOfWork
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
其中(x=>x.GetType()
.GetProperty(搜索过滤器)
.GetValue(x).ToString(),StringComparer.OrdinalIgnoreCase).AsQueryable();
返回查询;
试试这样的方法
public class CaseInsensitiveComparer:IComparer
{
公共整数比较(字符串a、字符串b)
{
返回string.Compare(a、b、StringComparison.OrdinalIgnoreCase);
}
}
[启用查询(HandleNullPropagation=HandleNullPropagationOption.False)]
[ODataRoute]
[授权范围(AppScopes.FarmerListRead)]
[HttpGet]
公共IQueryable GetAll()
{
返回工作单元
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
.OrderBy(x=>x.firstName,new CaseInsensitiveComparer());
}
==编辑==
以下可查询扩展支持按单个列名按升序或降序排序(默认为升序)
名称空间系统.Linq
{
公共静态类QueryableExtensions
{
公共静态IOrderedQueryable排序(此IQueryable源、IComparer比较器、字符串排序表达式)
{
bool-sortDescending=false;
if(sortExpression.EndsWith(“DESC”,StringComparison.OrdinalIgnoreCase))
{
sortDescending=true;
sortExpression=sortExpression.Substring(0,sortExpression.Length-5);
}
if(sortExpression.EndsWith(“ASC”,StringComparison.OrdinalIgnoreCase))
{
sortDescending=false;
sortExpression=sortExpression.Substring(0,sortExpression.Length-4);
}
var param=Expression.Parameter(typeof(TSource),“source”);
var expression=expression.Lambda(expression.Convert(expression.Property(param,sortExpression),typeof(string)),param);
如果(!sortDescending)
返回source.OrderBy(表达式、比较器);
其他的
返回source.OrderByDescending(表达式、比较器);
}
}
}
然后你可以用下面的方法
return\u工作单元
.FarmerveWrespository
.GetAllQueryable()
.UseAsDataSource()
.For();
.Sort(new CaseInsensitiveComparer(),“firstName asc”);
它假定所有对象属性都可以被合理地转换为字符串。如果属性上有自定义类,则需要确保适当地重写ToString()
此外,它仅适用于单个字段,即:“field”
、“field1 asc”
或“field1 desc”
。如果你想的话,我就把这额外的愚蠢留给你