GetAllWithChildren 上的 SQLite Extentions 内部连接

SQLite Extentions inner joins on GetAllWithChildren

我们目前正在尝试将 SQLite 扩展 (PCL) 作为 ORM。

我们想知道如果它们在实体中正确配置,映射是否应该在 children 上构建一个带有内部连接的 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);

我们的结果是每个 child (EnterpriseClient) 有多个 select,我们希望它能在一个 select 和一个连接中同时收集所有数据。

是我们的配置有误还是应该如此?

现在,SQLite-Net Extensions 对每个要获取的 属性 执行 SELECT,并且在读取操作中也会受到 N+1 issue 的影响(写入操作已经解决) .它作为 SQLite.Net 上的一个非常薄的层实现,为您提供一些访问实体关系的便捷方法。目前它按照您描述为预期行为的方式工作。通过主键或索引访问寄存器 属性 它非常快,并且性能对于大多数移动项目中使用的小型数据库来说不是问题。

SQLite-Net Extensions 是一个不断发展的项目,因此始终欢迎功能请求(当然还有拉取请求)。但是,INNER JOIN 会破坏 SQLite.Net 映射,因此返回所有必需信息的单个 SELECT 需要重新实现 SQLite.Net 映射机制。

理论上可以解决 N+1 问题,对每个 属性 执行单个 SELECT,因此递归 TO-MANY 操作会提高性能。我创建了 an issue 来跟踪此请求。

编码愉快!