Asynchronous EF6-在Where()子句中使用await关键字

Asynchronous EF6-在Where()子句中使用await关键字,asynchronous,asp.net-mvc-5,entity-framework-6,where,async-await,Asynchronous,Asp.net Mvc 5,Entity Framework 6,Where,Async Await,我正在用entity framework 6编写一个MVC 5 internet应用程序,在使用.Where()子句时,我对使用wait关键字有疑问 以下是我的代码: public async Task<Account> GetAccount(string userName) { if (Session[userName] == null) { Account account = db.accounts.Where(a => a.userName

我正在用entity framework 6编写一个MVC 5 internet应用程序,在使用
.Where()
子句时,我对使用
wait
关键字有疑问

以下是我的代码:

public async Task<Account> GetAccount(string userName)
{
    if (Session[userName] == null)
    {
        Account account = db.accounts.Where(a => a.userName.Equals(userName)).FirstOrDefault();
        if (account == null)
        {
            //log out
            return null;
        }
        Session[userName] = account;
    }
    return Session[userName] as Account;
}
使用
.Where()
子句时是否可以使用
wait
关键字


提前感谢。

没有EF提供的
wheresync()
方法(显然是因为它不能潜在地阻止,因为LINQ使用延迟执行),但是因为您正在执行
FirstOrDefault()
您可以简单地使用
FirstOrDefaultAsync()
方法:

Account account = await db.accounts.FirstOrDefaultAsync(a => a.userName.Equals(userName));

请参见

等待关键字只能用于返回“任务…”的方法,既不能用于
。Where
也不能用于
。FirstOrDefault
(这是链中的最后一个方法,因此等待关键字将应用于该方法)返回
任务

理论上,您可以编写自己的扩展方法,该方法只需围绕
.Where
.FirstOrDefault
方法

此外,这个问题并不完全针对EF,而是一个“纯粹”的C#问题

public static class ExtensionMethods
{
    public static async Task<IEnumerable<T>> WhereAsync<T>(this IEnumerable<T> source, Func<T, bool> selector)
    {
        return await Task.Run(() => source.Where(selector));
    }
}
公共静态类扩展方法
{
公共静态异步任务同步(此IEnumerable源,Func选择器)
{
返回等待任务。运行(()=>source.Where(选择器));
}
}
虽然那会有点过分

您可以将整个方法包装在一个任务中,因此最终的代码如下所示:

public async Task<Account> GetAccount(string userName)
{
    return await Task.Run(() =>
    {
        if (Session[userName] == null)
        {
            Account account = db.accounts.Where(a => a.userName.Equals(userName)).FirstOrDefault();
            if (account == null)
            {
                //log out
                return null;
            }
            Session[userName] = account;
        }
        return Session[userName] as Account;
    });
}
公共异步任务GetAccount(字符串用户名)
{
返回等待任务。运行(()=>
{
if(会话[用户名]==null)
{
Account Account=db.accounts.Where(a=>a.userName.Equals(userName)).FirstOrDefault();
如果(帐户==null)
{
//注销
返回null;
}
会话[用户名]=帐户;
}
将会话[用户名]返回为帐户;
});
}
public async Task<Account> GetAccount(string userName)
{
    return await Task.Run(() =>
    {
        if (Session[userName] == null)
        {
            Account account = db.accounts.Where(a => a.userName.Equals(userName)).FirstOrDefault();
            if (account == null)
            {
                //log out
                return null;
            }
            Session[userName] = account;
        }
        return Session[userName] as Account;
    });
}