实体框架6,ToListAsync返回随机数据

时间:2018-03-19 09:32:57

标签: .net entity-framework linq repository-pattern

我正在使用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();
    }

它返回绝对无序的数据。

result after TakeWhereAsync

我试图从IQueryable

获取SQL请求

generated SQL-query

它返回了有序数据。

result after query

你能提供解决方案吗?

1 个答案:

答案 0 :(得分:0)

通过评论中的讨论,我们有:

var testData = await _repository.TakeWhereAsync(_ => sortField, ...)

我假设sortField在这里是string - 也许是"Id" - 这意味着您要根据常量对所有行进行排序:字符串文字"Id",每行不会改变。您实际上想要的是对通过解析该字段找到的列进行排序。您可以通过对许多预期方案进行硬编码,或者通过基于反射构建表达式树来实现此目的。可以找到here的完整示例。使用本答案中的代码,您将拥有:

string orderByField = "Id";
IQueryable<T> query = ... // from somewhere, your db context etc
query = query.OrderBy(orderByField); // using the code from the linked question
相关问题