异步等待Linq中的Select()

时间:2018-06-16 10:27:41

标签: c# asp.net-mvc entity-framework linq

我有一个ViewComponent,以及DTOViewModel类。我想将ViewModels的列表传递给视图,但由于async/await我无法在一行中执行此操作:

 List<PageVM> pages = await _context.Pages.ToArray().Where(x => x.Slug != "home").OrderBy(x => x.Sorting).Select(x => new PageVM(x)).ToList();

我可以在更多行中这样做:

List<PageVM> pages = new List<PageVM>();

List<PageDTO> dto = await _context.Pages.Where(x => x.Slug != "home").ToListAsync();

foreach (var item in dto)
{
    pages.Add(new PageVM(item));
}

但是可以修改一行,以便与await一起使用吗?

2 个答案:

答案 0 :(得分:1)

是的,它是;请注意括号:

var pages = (await _context.Pages.Where(x => x.Slug != "home").ToListAsync()).Select(x => new PageVM(x)).ToList();

但是,这相当于以下两个陈述:

var dtos = await _context.Pages.Where(x => x.Slug != "home").ToListAsync();
var pages = dtos.Select(x => new PageVM(x)).ToList();

哪个IMO更容易阅读。

答案 1 :(得分:0)

是的,你需要用括号包装等待的表达式。 这样的事情应该做。

List<PageVM> pages = (await _context.Pages.Where(x => x.Slug != "home").ToListAsync())
.Select(item => new PageVM(item)).ToList();