【问题标题】:How to use EF Core extension methods asynchronously如何异步使用 EF Core 扩展方法
【发布时间】:2020-07-09 16:55:57
【问题描述】:

我有一个带有表达式的过滤方法,像这样:

public IQueryable<Alert> GetAlerts(Expression<Func<Alert, bool>> filter, bool includeDone = false)
{
    var query = _patientDbContext.Alerts
                .Where(filter);

    if (!includeDone)
    {
        query = query.Where(i => !i.IsDone);
    }

    query = query.OrderBy(i => i.Deadline);

    return query;
}

但是现在我想在实际函数中调用这个过滤方法

public async Task<List<Alert>> GetAllAlertsForOrganisation(int organisationId, DateTime? beginDate, DateTime? endDate)
{
    var query2 = GetAlerts(i => i.OrganisationId == organisationId && (beginDate == null || i.CreatedAt <= endDate) &&
                (endDate == null || i.CreatedAt >= beginDate)).ToList();

    return await ....//What to call the GetAlerts method?
                .ToListAsync();
}

【问题讨论】:

  • GetAlerts 方法没有异步操作,为什么需要异步调用?
  • 因为它是.net核心应用。所以数据来自数据库。否则获取数据需要很长时间
  • 不,方法是建库查询,不会执行查询。 ToListAsync() 执行查询。
  • @weichch。是的,你是对的。但是如何调用方法呢?
  • 你只需要await GetAlerts(alert =&gt; alert.IdontKnow == desiredValue).ToListAsync();

标签: c# linq asp.net-core iqueryable


【解决方案1】:

这是异步的:

var query2 = GetAlerts(i => i.OrganisationId == organisationId && (beginDate == null || i.CreatedAt <= endDate) && (endDate == null || i.CreatedAt >= beginDate));

return await query2.ToListAsync();

正如@weichch 所说,GetAlerts doesn't execute anything in the database

Entity Framework Core 提供了一组类似于 LINQ 方法的异步扩展方法,它们执行查询并返回结果。示例包括 ToListAsync()、ToArrayAsync()、SingleAsync()。一些 LINQ 运算符(例如 Where(...) 或 OrderBy(...))没有异步版本,因为这些方法仅构建 LINQ 表达式树,不会导致查询在数据库中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2021-09-19
    • 2015-03-12
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多