我有 2 个类,见下文它们是我们用来访问数据库的 POCO 类,我们使用代码优先方法并使用 ApplicationEntityConfiguration 显式配置实体和 DB 表之间的所有映射。
public class Group
{
public string Code { get; set; }
public string Name { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
public class Item
{
public string Code { get; set; }
public string Name { get; set; }
public virtual Group ParentGroup { get; set; }
}
Groups 和 Childs 之间的关系并不明确。没有外键。逻辑关系由代码定义,组应包含所有代码与父组相同的项目
Context.Items.Where(x => x.Code.StartsWith(parentGroup.Code));
我需要向调用者方法返回数据库中所有组的集合,每个组的所有子组。请求数据时,我可以使用 Where 请求 Context.Groups 并为每个 Group 请求 Items。我在数据库中有超过 50 个组和超过 1000 个项目所以这种手动方法会导致对数据库进行超过 50 个查询,并且会对性能产生影响
更优化的解决方案是请求一个集合中的所有组,然后请求另一个集合中的所有项目,然后当所有这些数据在内存中时,为每个组填充一个项目集合......然后它不会对数据库产生很多影响。
所以,虽然我总体上能够实现目标,但我想知道是否有更优雅的解决方案,我们可以声明性地告诉 Enity Framework 组和项目之间的关系是使用表达式建立的 .Where(x => x.Code.StartsWith (parentGroup.Code)) ,然后一旦它被声明,开发人员可以在他想要一起加载组和项目时使用 Include() 或者依赖延迟加载可以在子项目被访问时加载它们