簡體   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