Entity Framework ToListAsync() with Select()

Split in into two statements:

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

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

The .ToListAsync() returns a Task, so it doesn't accept the .Select extension method, which will need some IEnumerable. Only when you await that Task, you will get the List.

Another way (less readable IMO) would be:

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

Note the extra ( ) around the await clause, which mean that the Select will work on the result of the awaited code, instead of the Task.


You will need to await the query before calling select, but given that the query is simply selecting a model out of the query you can create the model within the query and just await that.

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

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

    var tickets = await (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 Ticket
        {
            Id = a.Id,
            DivisionId = a.DivisionId,
            Name = a.Name,
            TicketDate = a.TicketDate,
            NewPosts = a.NewPosts,
            Status = a.Status,
            Type = a.Type
         })
         .ToListAsync();

    return PartialView(tickets);
}

You also need to import System.Data.Entity rather than just System.Linq. That may seem silly, but I ended up on this question due to this. ToList is part of Linq but the async methods are specific to EF.