实体框架 ToListAsync() 和 Select()

2023-12-29

我的控制器中有以下 ActionResult

public async Task<ActionResult> NewTickets()
{
    // Show tickets for all divisions a agent is in

    var user = "abcdefg";
    var company = "company1";

    var tickets = (from a in db2.Ticket
        join c in db2.Division on a.DivisionId equals c.DivisionId
        join dp in db2.DivisionParticipator on c.DivisionId equals dp.DivisionId
        where c.CompanyId == company.CompanyId && a.Status == "New" && dp.ApplicationUserId == user.Id
        select new
        {
            Id = a.Id,
            DivisionId = a.DivisionId,
            Name = a.Name,
            TicketDate = a.TicketDate,
            NewPosts = a.NewPosts,
            Status = a.Status,
            Type = a.Type
         })
         .ToList().Select(x => new Ticket
         {
             Id = x.Id,
             DivisionId = x.DivisionId,
             Name = x.Name,
             TicketDate = x.TicketDate,
             NewPosts = x.NewPosts,
             Status = x.Status,
             Type = x.Type
          });            

    return PartialView(tickets.ToList());
}

我想要实现的是运行这个异步,但是如果添加ToListAsync()before Select()the Select()方法变得不可用。这同样适用于return PartialView(tickets.ToList()).

我对使用异步还很陌生,但在了解它的优点后,我一直在将常规 ActionResult 方法与异步方法进行转换。到目前为止,使用更简单的基于 LINQ 的查询一切进展顺利。然而,对于这个 ActionResult 方法,查询有点更高级,并且实现它的语法/方式似乎有所不同。

任何帮助我走向正确方向的帮助将不胜感激!


分为两个语句:

var tickets0 = await (from ...).ToListAsync();

var tickets = tickets0.Select(...);

The .ToListAsync()返回一个Task,所以它不接受.Select扩展方法,这将需要一些IEnumerable。只有当你await该任务,您将得到List.

另一种方法(IMO 可读性较差)是:

 var tickets = (await (from ...).ToListAsync()).Select(...);

请注意await 子句周围的额外(),这意味着Select 将处理等待代码的结果,而不是Task。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 ToListAsync() 和 Select() 的相关文章

随机推荐