Asynchronous EF6-在Where()子句中使用await关键字
我正在用entity framework 6编写一个MVC 5 internet应用程序,在使用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
.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;
});
}