linq - 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 秒内完成感觉相当缓慢。
解决方案
将 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();
推荐阅读
- sql - 按组从递归事件中获取第一个日期
- java - JAVA 传递原始类型作为对函数调用的引用
- docker - docker-compose down --rmi all 与容器共享镜像
- drupal - Drupal 7 OR 条件与一系列 AND 条件
- excel - 使用变量定义控件在vba中的窗体上定义控件标题
- html - 我正在尝试为我的其他代码应用此效果(例如从下到上推动窗口),但它不起作用
- ios - 将日期字符串表示为 UTC 日期并将其转换为本地时区
- java - 如何排除错误的数据输入
- jenkins - Jenkins 2.121.3 LTS 版本中的 JDK 警告
- r - 在 R 中将日期转换为文本