繁体   English   中英

方法获取列表异步? &#39;清单 <ListDefinition> &#39;不包含&#39;ToListAsync&#39;的定义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM