在 EF Core 和导航中遇到排序问题 属性
Facing issue with sorting in EF Core & navigation property
我正在使用 .net 核心和 EF 核心 2.0。
我有以下 3 个表
- 用户
- 角色
- 用户角色
现在我想在有 2 列的屏幕上显示数据
1.用户名
2. 角色
为了允许用户排序、搜索和分页,我在我的应用程序中使用了以下通用代码。
public async Task<PagedResult<User>> GetAll(string filter, int pageIndex, int pageSize, string sortColumn, string sortDirection)
{
filter = filter?.Trim().ToLower();
var data = usersRepository.Query(true).Include(x => x.UserRoles).ThenInclude(x => x.Role).AsQueryable();
try
{
if (!string.IsNullOrWhiteSpace(filter))
{
data = data.Where(x => x.Username.ToLower().Contains(filter));
}
//sort
var ascending = sortDirection == "asc";
if (!string.IsNullOrWhiteSpace(sortColumn))
{
switch (sortColumn.Trim().ToLower())
{
case "username":
data = data.OrderBy(p => p.Username, ascending);
break;
case "isactive":
data = data.OrderBy(p => p.IsActive, ascending);
break;
case "role":
data = data.OrderBy(p => p.UserRoles.OrderBy(o => o.Role.Name), ascending);
break;
default:
data = data.OrderBy(p => p.Username, ascending);
break;
}
}
var test = data.ToList();
}
catch (Exception e)
{
//todo:
}
return await data.GetPaged(pageIndex, pageSize);
}
其中 OrderBy 是泛型方法
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending)
{
return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
}
现在一切正常,除了当我通过搜索栏 'role' 时。
它给我以下错误。
异常: 无法比较数组中的两个元素。
InnerException: 至少一个对象必须实现 IComparable。
我该如何处理这种情况,如有任何帮助,我们将不胜感激。
使用中间层管理角色名称列。为此,我在响应中创建了一个名为 "UserList" 的新 class,其中包含所需的属性。
public async Task<PagedResult<UserList>> GetAll(string filter, int pageIndex, int pageSize, string sortColumn, string sortDirection)
{
filter = filter?.Trim().ToLower();
var data = usersRepository.Query(true)
.Include(x => x.UserRoles)
.ThenInclude(x => x.Role)
.Select(x => new UserList()
{
Username = x.Username,
UserId = x.UserId,
IsActive = x.IsActive,
RoleId = x.UserRoles.FirstOrDefault().RoleId,
RoleName = x.UserRoles.FirstOrDefault().Role.Name
})
.AsQueryable();
try
{
if (!string.IsNullOrWhiteSpace(filter))
{
data = data.Where(x => x.Username.ToLower().Contains(filter) || x.RoleName.ToLower().Contains(filter));
}
//sort
var ascending = sortDirection == "asc";
if (!string.IsNullOrWhiteSpace(sortColumn))
{
switch (sortColumn.Trim().ToLower())
{
case "username":
data = data.OrderBy(p => p.Username, ascending);
break;
case "isactive":
data = data.OrderBy(p => p.IsActive, ascending);
break;
case "rolename":
data = data.OrderBy(p => p.RoleName, ascending);
break;
default:
data = data.OrderBy(p => p.Username, ascending);
break;
}
}
}
catch (Exception e)
{
//todo:
}
return await data.GetPaged(pageIndex, pageSize);
}
我正在使用 .net 核心和 EF 核心 2.0。 我有以下 3 个表
- 用户
- 角色
- 用户角色
现在我想在有 2 列的屏幕上显示数据 1.用户名 2. 角色
为了允许用户排序、搜索和分页,我在我的应用程序中使用了以下通用代码。
public async Task<PagedResult<User>> GetAll(string filter, int pageIndex, int pageSize, string sortColumn, string sortDirection)
{
filter = filter?.Trim().ToLower();
var data = usersRepository.Query(true).Include(x => x.UserRoles).ThenInclude(x => x.Role).AsQueryable();
try
{
if (!string.IsNullOrWhiteSpace(filter))
{
data = data.Where(x => x.Username.ToLower().Contains(filter));
}
//sort
var ascending = sortDirection == "asc";
if (!string.IsNullOrWhiteSpace(sortColumn))
{
switch (sortColumn.Trim().ToLower())
{
case "username":
data = data.OrderBy(p => p.Username, ascending);
break;
case "isactive":
data = data.OrderBy(p => p.IsActive, ascending);
break;
case "role":
data = data.OrderBy(p => p.UserRoles.OrderBy(o => o.Role.Name), ascending);
break;
default:
data = data.OrderBy(p => p.Username, ascending);
break;
}
}
var test = data.ToList();
}
catch (Exception e)
{
//todo:
}
return await data.GetPaged(pageIndex, pageSize);
}
其中 OrderBy 是泛型方法
public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool ascending)
{
return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector);
}
现在一切正常,除了当我通过搜索栏 'role' 时。
它给我以下错误。
异常: 无法比较数组中的两个元素。
InnerException: 至少一个对象必须实现 IComparable。
我该如何处理这种情况,如有任何帮助,我们将不胜感激。
使用中间层管理角色名称列。为此,我在响应中创建了一个名为 "UserList" 的新 class,其中包含所需的属性。
public async Task<PagedResult<UserList>> GetAll(string filter, int pageIndex, int pageSize, string sortColumn, string sortDirection)
{
filter = filter?.Trim().ToLower();
var data = usersRepository.Query(true)
.Include(x => x.UserRoles)
.ThenInclude(x => x.Role)
.Select(x => new UserList()
{
Username = x.Username,
UserId = x.UserId,
IsActive = x.IsActive,
RoleId = x.UserRoles.FirstOrDefault().RoleId,
RoleName = x.UserRoles.FirstOrDefault().Role.Name
})
.AsQueryable();
try
{
if (!string.IsNullOrWhiteSpace(filter))
{
data = data.Where(x => x.Username.ToLower().Contains(filter) || x.RoleName.ToLower().Contains(filter));
}
//sort
var ascending = sortDirection == "asc";
if (!string.IsNullOrWhiteSpace(sortColumn))
{
switch (sortColumn.Trim().ToLower())
{
case "username":
data = data.OrderBy(p => p.Username, ascending);
break;
case "isactive":
data = data.OrderBy(p => p.IsActive, ascending);
break;
case "rolename":
data = data.OrderBy(p => p.RoleName, ascending);
break;
default:
data = data.OrderBy(p => p.Username, ascending);
break;
}
}
}
catch (Exception e)
{
//todo:
}
return await data.GetPaged(pageIndex, pageSize);
}