GetAllWithChildren
遇到N+1
问题,在您的特定情况下,这表现特别糟糕。您的问题不清楚您正在尝试什么,但您可以尝试以下解决方案:
使用filter
参数GetAllWithChildren
:
filter
您可以使用内部执行查询的属性,而不是将所有对象加载到内存然后过滤,Table<T>().Where(filter)
SQLite-Net 将转换为SELECT-WHERE
子句,因此它非常有效:
var list = connection.GetAllWithChildren<DataModel>(d => d.Name == "Jason");
执行查询,然后加载关系
如果您查看GetAllWithChildren
代码,您会发现它只是执行查询然后加载现有关系。您可以自己执行此操作以避免自动加载不需要的关系:
// Load elements from database
var list = connection.Table<DataModel>().Where(d => d.Name == "Jason").toList();
// Iterate elements and load relationships
foreach (DataModel element in list) {
connection.GetChildren(element, recursive = false);
}
手动加载关系
要完全解决N+1 问题Contains
,您可以使用带有外键的过滤器手动获取关系。这在很大程度上取决于您的实体模型,但看起来像这样:
// Load elements from database
var list = connection.Table<DataModel>().Where(d => d.Name == "Jason").toList();
// Get list of dependency IDs
var dependencyIds = list.Select(d => d.DependencyId).toList();
// Load all dependencies from database on a single query
var dependencies = connection.Table<Dependency>.Where(d => dependencyIds.Contains(d.Id)).ToList();
// Assign relationships back to the elements
foreach (DataModel element in list) {
element.Dependency = dependencies.FirstOrDefault(d => d.Id == element.DependencyId);
}
此解决方案解决了 N+1 问题,因为它只执行两个数据库查询。