如何替换实体框架FirstOrDefaultAsync

时间:2014-02-04 18:43:11

标签: c# entity-framework async-await asp.net-identity

使用ASP.NET身份并使用实体框架 UserStore 自定义到我自己的数据库表集合时

public Task<MyUser> FindByNameAsync(string userName)
{
   var context = new CompanyDbContext();

   Task<MyUser> task = context.MyUsers.Where(u => u.UserName == userName)
                                      .FirstOrDefaultAsync();

   return task;
}

并像这样调用它可以正常工作:

MyUser user = await userManager.FindAsync(context.UserName, context.Password);

现在,我想用以下用户的硬编码列表替换它:

public Task<MyUser> FindByNameAsync(string userName)
{
   var myusers = new List<MyUser> 
   { 
       new MyUser() { Id="1", UserName = "tom", Password = "secret" },
       new MyUser() { Id="2", UserName = "mary", Password = "supersecret" }
   };

   Task<MyUser> task = new Task<MyUser>(() => myusers.SingleOrDefault(
                                                  u => u.UserName == userName));

   return task;
}

但这不起作用,因为它挂在这一行

MyUser user = await userManager.FindAsync(context.UserName, context.Password);

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:6)

您创建了Task,但从未启动它,因此它永远不会运行,因此等待它意味着永远等待。

您可以在创建任务后添加对Start的调用,但创建要立即运行的任务时的首选选项是简单地使用Task.Run(或{{1}如果您使用的是.NET 4.0)。

那个之上,你的代码甚至不需要在后台线程中运行。它将足够快地完成,您可以简单地同步执行它。您可以使用Task.Factory.StartNew来计算结果并将其包装在已完成的任务中。

答案 1 :(得分:2)

试试这个......

public Task<MyUser> FindByNameAsync(string userName)
{
   var myusers = new List<MyUser> 
   { 
       new MyUser() { Id="1", UserName = "tom", Password = "secret" },
       new MyUser() { Id="2", UserName = "mary", Password = "supersecret" }
   };

   var task = Task.FromResult(myusers.SingleOrDefault(u => u.UserName == userName));

   return task;
}