简体   繁体   English

如何使异步方法返回任务<ienumerable<t> >? </ienumerable<t>

[英]How do I make an async method return Task<IEnumerable<T>>?

I am currently refactoring a method that has the async keyword but does not use await, thus running synchronously.我目前正在重构一个方法,该方法具有 async 关键字但不使用 await,因此同步运行。

private async Task<IEnumerable<Obj>> SearchObj(string value)
    {
        if (string.IsNullOrEmpty(value))
            return _db.Objects;

        return _db.Objects.AsEnumerable().Where(x => x.SomeProperty.Contains(value, StringComparison.InvariantCultureIgnoreCase));
    }

How do I modify this method so that it runs asynchronously?如何修改此方法以使其异步运行? Is it even necessary to run this asynchronously given a large dataset?给定一个大数据集,甚至有必要异步运行它吗?

I have tried using the AsAsyncEnumerable() method but am not sure how to execute the Where() filter on an IAsyncEnumerable object.我曾尝试使用 AsAsyncEnumerable() 方法,但不确定如何在 IAsyncEnumerable object 上执行 Where() 过滤器。

Don't use AsEnumerable .不要使用AsEnumerable Use one of the *Async() Methods:使用其中一种 *Async() 方法:

private async Task<IEnumerable<Obj>> SearchObj(string value)
{
    if (string.IsNullOrEmpty(value))
        return await _db.Objects.ToListAsync();

    return await _db.Objects.Where(x => x.SomeProperty.Contains(value, StringComparison.InvariantCultureIgnoreCase)).ToListAsync();
}

AsEnumerable is not async method and it is needed to use ToListAsync , ToArrayAsync before returning IEnumerable . AsEnumerable不是异步方法,需要在返回IEnumerable之前使用ToListAsyncToArrayAsync Also note that .Contains(value, StringComparison.InvariantCultureIgnoreCase) overload translation is not supported.另请注意,不支持.Contains(value, StringComparison.InvariantCultureIgnoreCase)重载转换。 Just use .Contains(value) , if default collation in database is case insensitive, it will work by default.只需使用.Contains(value) ,如果数据库中的默认排序规则不区分大小写,它将默认工作。

private Task<IEnumerable<Obj>> SearchObj(string value)
{
    var query = _db.Objects.AsQueryable();

    if (!string.IsNullOrEmpty(value))
        query = query.Where(x => x.SomeProperty.Contains(value));

    return query.ToListAsync();
}

If dtabase/column collation is not case insitive, you have to upper/lower case string values:如果数据库/列排序规则不区分大小写,则必须使用大写/小写字符串值:

private Task<IEnumerable<Obj>> SearchObj(string value)
{
    var query = _db.Objects.AsQueryable();

    if (!string.IsNullOrEmpty(value))
    {
        value = value.ToUpper();
        query = query.Where(x => x.SomeProperty.ToUpper().Contains(value));
    }

    return query.ToListAsync();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM