C# 使用OData在EF Core中排序不区分大小写

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

我在.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端点如下所示:

[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”
。如果你想的话,我就把这额外的愚蠢留给你