【发布时间】:2013-10-07 14:58:40
【问题描述】:
我学习了asp.net身份,async/await,遇到了这个问题:
我有一些IEnumerable<T> list 的功能。我使用查询语法填写的这个列表如下所示:
private IEnumerable<SomeModel> GetPersons(int categoryId) {
IEnumerable<SomeModel> persons = from g in db.Categories
join c in db.Persons on g.PersonTypeId equals c.PersonTypeId
where g.CategoryId == categoryId
select new SomeModel
{
PersonName = c.FirstName + " " + c.LastName,
//....etc.
//And here I need call asynchronous function something like this:
IsAdmin = GetPermission(c.Email)
}
if (persons.Any()) {
return persons;
}
return Enumerable.Empty<SomeModel>();
}
在 SomeModel 中将 IsAdmin 设为 bool(当我在 GetPermission 中尝试 Task<bool> 时,我在 SomeModel 中使用 Task<bool>)。
在GetPermission() 中是这样的:
private bool GetPermission(string email) {
var user = SomeMembershipService.GetUser(email); //SomeMembershipService is Interface with Tasks and so on.
var roles = SomeMembershipService.GetRoles(user.Id); //user.Id is as string
bool result = false;
if (roles != null) {
var adm = roles.Result.FirstOrDefault(x => x.Name.Contains("Admin"));
result = adm != null;
}
return result;
}
我尝试使用 async/await 和作为 Task 进行写入,但我的两次尝试都是错误的。所以我认为我必须在IEnumerable<SomeModel> persons 之外调用GetPermission(),所以我将这段代码添加到条件之后。所以代码看起来像这样:
private IEnumerable<SomeModel> GetPersons(int categoryId) {
IEnumerable<SomeModel> persons = from g in db.Categories
join c in db.Persons on g.PersonTypeId equals c.PersonTypeId
where g.CategoryId == categoryId
select new SomeModel
{
PersonName = c.FirstName + " " + c.LastName
//....etc.
}
if (persons.Any())
{
//new code
foreach (var p in persons)
{
p.IsAdmin = GetPermission(p.Email);
}
//end of new code
return persons;
}
return Enumerable.Empty<SomeModel>();
}
但这也是错误的。也许我对 asp.net 身份和 async/await 以及它们的使用理解不好......
你能帮我吗 - 我必须做什么?因为现在,GetPermission 被调用太晚了,所以应用程序崩溃了。当我在人员查询中调用GetPermission 时,函数也被调用得太晚(在填写人员列表之后)。我不知道如何继续。
GetUser() 与 public IUser GetUser(string username) 相同,GetRoles() 与 public async Task<IEnumerable<IRole>> GetRoles(string userId) 相同。我敢肯定,这两种方法都可以正常工作,我在其他代码中使用它们并且没有问题。所以我认为它必须在上面的代码中。
很抱歉,如果这是个愚蠢的问题,但我在此处和 msdn 上阅读了很多内容,但找不到结果。谢谢大家。
为什么我要像上面那样使用异步函数
我想要那里的函数,因为当我将整个函数作为异步任务时,另一个调用它的函数不能正常工作。
我有这个功能 - 它是 kendogrid () 的数据绑定:
[HttpPost]
public ActionResult _PersonsBinding([DataSourceRequest]DataSourceRequest request, int id)
{
DataSourceResult result = GetPersons(id).ToDataSourceResult(request);
return Json(result);
}
当我将函数 IEnumerable<SomeModel> GetPersons 设为 async Task<IEnumerable<SomeModel>> GetPersons 时,绑定函数不知道 ToDataSourceResult(),当我将此函数设为异步时。如果这里有问题,我该如何解决?
请耐心等待我,我是新手...
【问题讨论】:
-
你为什么要查看
if (persons.Any()),如果你返回persons或Enumerable.Empty<SomeModel>();不会有什么不同 -
仅返回人员存在一些问题。我不记得为什么,但这有帮助。这是给肯多格的。但我认为这不是我的问题的原因。
-
你能告诉我,为什么你想要那里的异步功能,对我来说似乎没有意义!为什么不将整个函数放在异步任务中?
标签: c# asp.net async-await asp.net-identity linq-query-syntax