我们目前正在尝试将SQLite Extentions(PCL)作为ORM。
我们想知道如果在实体中正确配置了映射是否应该在子节点上构建带有INNER JOIN的SELECT?
public class Project
{
[PrimaryKey]
public long Id { get; set; }
[ForeignKey(typeof(EnterpriseClient))]
public long EnterpriseClientId { get; set; }
[ManyToOne]
public EnterpriseClient EnterpriseClient { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<WorkOrderHead> WorkOrderHeads { get; set; }
}
如果我们使用GetAllWithChildren获取所有项目:
var x = _db.GetAllWithChildren<Project>(p => true);
我们的结果是每个孩子(EnterpriseClient)有多个选择,我们希望它会在一个选择和一个联接中一次性收集所有数据。
我们的配置是错误的还是它应该是这样的?
答案 0 :(得分:1)
现在,SQLite-Net Extensions为每个要获取的属性执行SELECT,并且在读取操作中也遇到N+1 issue(已经为写入操作解决了)。它在SQLite.Net上实现为一个非常薄的层,为您提供了一些访问实体关系的便捷方法。目前它的工作方式与您描述的预期行为相同。通过主键或索引属性访问寄存器的速度非常快,对于像大多数移动项目中使用的小型数据库而言,性能不是问题。
SQLite-Net Extensions是一个不断发展的项目,因此欢迎使用功能请求(以及拉取请求)。但是,INNER JOIN会破坏SQLite.Net映射,因此返回所有必需信息的单个SELECT将需要重新实现SQLite.Net映射机制。
理论上可以解决为每个属性执行单个SELECT的N + 1问题,因此递归TO-MANY操作会看到性能提升。我已创建an issue以跟踪此请求。
快乐的编码!