0

我们目前正在尝试将 SQLite 扩展 (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)进行多项选择,我们希望它可以在一次选择和一次连接中收集所有数据。

我们的配置是错误的还是应该是这样的?

4

1 回答 1

2

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

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

理论上可以解决为每个属性执行单个 SELECT 的 N+1 问题,因此递归 TO-MANY 操作将看到性能改进。我创建了一个问题来跟踪此请求。

快乐编码!

于 2015-07-07T09:12:42.037 回答