【发布时间】:2018-03-19 09:32:57
【问题描述】:
我正在使用 EF6(使用 MySQL 提供程序),我发现了奇怪的行为。 我使用通用存储库中的 TakeWhereAsync 方法。
public async Task<IReadOnlyCollection<T>> TakeWhereAsync(Expression<Func<T, string>> sortExpression,
Expression<Func<T, bool>> whereExpression,
bool desc, int pageSize, int pageIndex)
{
var skipRows = (pageIndex - 1) * pageSize;
var query = GetAllQuery().Where(whereExpression);
query = desc
? query.OrderByDescending(sortExpression)
: query.OrderBy(sortExpression);
return await query.Skip(skipRows).Take(pageSize).ToListAsync();
}
它返回绝对无序的数据。
我尝试从 IQueryable 获取 SQL 请求
它返回了有序的数据。
您能否提供修复它的选项?
【问题讨论】:
-
您确定您传递的
sortExpression是正确的吗?从生成的 SQL 看起来您是按 constant 参数值排序的,在这种情况下,返回记录的顺序是未定义的。 -
你能显示调用
TakeWhereAsync的代码吗?我同意@Ivan 的观点,您似乎只是传递了一个不正确的排序表达式;具体来说,您正在按参数值 (@p__linq__0) 进行排序。您是否将x => "Id"作为排序表达式传递?不按Id列排序 - 它按字符串文字"Id"排序,不会每行更改:所以不应用排序 -
@IvanStoev 谢谢,这是正确的评论。您可以将其发布为答案吗?另外,你能提供这个方法签名的实现吗?
-
@MarcGravell screencast.com/t/JYfuY9rtwJ
-
@Imixal 我可以假设
sortField是一个字符串吗?
标签: .net entity-framework linq repository-pattern