【问题标题】:Entity framework 6, ToListAsync is returned randomized data实体框架6、ToListAsync返回随机数据
【发布时间】: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 =&gt; "Id" 作为排序表达式传递?不按 Id 列排序 - 它按字符串文字 "Id" 排序,不会每行更改:所以不应用排序
  • @IvanStoev 谢谢,这是正确的评论。您可以将其发布为答案吗?另外,你能提供这个方法签名的实现吗?
  • @Imixal 我可以假设sortField 是一个字符串吗?

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


【解决方案1】:

根据 cmets 中的讨论,我们有:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多