首页 > 解决方案 > C# Linq 一对多查询 EF Core

问题描述

我有一个复选框项目表和一个存储用户选择的复选框项目的表。淡化的模型在EF中基本上是这样的

CheckboxItem 模型属性:

public CheckboxItem()
{
    SelectedCheckboxItems = new HashSet<SelectedCheckboxItems>
}

public int Id { get; set; }
public virtual ICollection<SelectedCheckboxItems> SelectedCheckboxItems { get; set; }

SelectedCheckboxItems 模型属性:

public int Id { get; set; }
public virtual Checkbox Checkbox { get; set; }

我正在尝试获取所有可用的复选框项目及其相应的选定复选框项目,并将它们推入一个视图模型,稍后我将使用该视图模型来使用正确的复选框填充视图/预先选择他们选择的选项。

到目前为止,我有一个可行的解决方案,但查询速度很慢,查询完成大约需要 4-5 秒:

 var testSub = _context.CheckboxItem.Include(a => a.SelectedCheckboxItems).Where(a => a...// filters)
                .Select(a => new ViewModel
            {
                CheckboxItemId = a.Id,
                Checked = a.SelectedCheckboxItems.Where(x => x.userId.Equals(userId) && x.Id == a.Id).Select(z => z.Checked == true).FirstOrDefault()
            }).AsNoTracking().ToList();

最终目标实际上只是返回一个 ViewModel 对象列表,其中包含所有可用的复选框项目以及该项目是否已被用户选中。

关于如何改进或以任何方式优化它以使其更快的任何提示?该表实际上只有 15 个可用的复选框项目,因此此查询在 4-5 秒内完成感觉相当缓慢。

标签: linqentity-framework-core

解决方案


将 ToList() 更改为 AsQueryable()。ToList() 会导致性能下降。

这个怎么样?

var selectedlist = db.SelectedCheckboxItems;
    var testSub = _context.CheckboxItem.Where(a => a...// filters)
    .Select(a => new ViewModel {
                CheckboxItemId = a.Id,
                Checked = selectedlist.Where(x => x.userId.Equals(userId) && x.Id == a.Id).Select(z => z.Checked == true).FirstOrDefault()
            }).AsNoTracking().AsQueryable();

推荐阅读