![](/img/trans.png)
[英]async/await "List<> does not contain a definition for 'GetAwaiter'"
[英]Method for getting a list async? 'List<ListDefinition>' does not contain a definition for 'ToListAsync'
我是asp.net核心编程的新手,它试图制作一个简单的列表应用程序,管理由ListDefinition定义的多个列表,每个列表包含多个ListItems。 我正在尝试使用异步方法,该方法在获取ListDefinition时效果很好( var currentList = await _context.ListDefinitions.Where(m => m.Id == id).FirstOrDefaultAsync();
)
但是,当尝试获取Listitems时,我找不到合适的方法来使其异步( var currentListItems = await currentList.ListItems.Distinct().ToListAsync();
不存在)
public class ListDefinition
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set; }
public Guid CreatedByUserGuid { get; set; }
public string Name { get; set; }
public virtual ICollection<ListItem> ListItems { get; set; }
}
public class ListItem
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int Id { get; set;
public string Description { get; set; }
public bool Done { get; set; }
public bool Important { get; set; }
}
public class CurrentListController : Controller
{
private readonly ApplicationDbContext _context;
public CurrentListController(ApplicationDbContext context)
{
_context = context;
}
// GET: CurrentList/5
public async Task<IActionResult> Index(int? id)
{
if (id == null)
{
return NotFound();
}
var currentList = await _context.ListDefinitions.Where(m => m.Id == id).FirstOrDefaultAsync();
var currentListItems = await currentList.ListItems.Distinct().ToListAsync();
if (currentListItems == null)
{
return NotFound();
}
return View(currentListItems);
}
(...)
错误信息:
'List<ListDefinition>' does not contain a definition for 'ToListAsync' and no extension method 'ToListAsync' accepting a first argument of type 'List<ListDefinition>'
您有两种选择:
不要利用延迟加载。 一键获取所有数据:
var currentList = await _context.ListDefinitions.Where(m => m.Id == id)
.Include(ld => ld.ListItems).FirstOrDefaultAsync();
这意味着数据已经被加载,因此在下一个调用中使用async没有任何好处:
var currentListItems = await currentList.ListItems.Distinct().ToList();
但是,由于您使用的是Distinct
(目的是什么?也许数据库中不应存在重复项?),所以可能会加载过多的数据。
因为您实际上并不使用当前列表,所以可以简单地加载以下项目:
var currentListItems = _context.ListItems
.Where(li => li.ListDefinitionId == id)
.Distinct().ToListAsync();
当然,这确实意味着您需要在ListItem
上定义外键,以与public virtual ICollection<ListItem> ListItems { get; set; }
匹配public virtual ICollection<ListItem> ListItems { get; set; }
public virtual ICollection<ListItem> ListItems { get; set; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.