【问题标题】:How to merge entity graphs in LLBLGen?如何在 LLBLGen 中合并实体图?
【发布时间】:2014-09-08 07:48:36
【问题描述】:

假设我有 2 个表,A 和 B,关系为 1-0..1。我使用适配器方法。我需要在一个地方加载 A 实体的集合,然后为所有 A 实体加载所有相关的 B 实体。不使用 Prefetch 的原因是在大多数情况下我不需要加载 B 实体。

我在所有地方都使用 LINQ,所以我想以同样的方式来做。

我正在尝试编写的代码如下所示:

var linqMetadata = new LinqMetaData(adapter)
{
    ContextToUse = new Context()
};

var aCollection = linqMetadata.A.Where(/*some filter*/).ToList();

// ...

var bIds = aCollection.Select(x => x.BId);
var bCollection = linqMetadata.B.Where(x => bIds.Contains(x.BId)).ToList();

问题在于bCollectionaCollection 保持未链接状态,即所有A 实体都有B = null,反之亦然。我希望设置这些引用,因此将 2 个图表合并为一个。

我可以使用 LINQ to Objects 加入 2 个集合,但这并不优雅,此外,如果两个集合都包含需要建立互连的复杂图形,这可能会变得更加复杂。

我可以编写从 B 到 A 的预取,但这是一个完全没有必要的额外数据库查询。

有没有一种简单的方法可以合并这两个图?

【问题讨论】:

  • 集合“保持未链接”是什么意思?您从表 B 中选择这些项目,这些项目的 ID 由表 A 的过滤版本中的记录引用。您想要实现什么?
  • 您可以尝试在第二个查询中添加预取路径到主记录 (A) 吗?我没有尝试过,但认为它可能会在不查询的情况下从上下文中获取 A 记录...
  • @kol 我希望 .NET 实体之间的引用基于 id 自动建立。这样在运行之后,所有A 实体都具有非空B 属性,反之亦然。如果我只运行 2 个查询,它们不是。这是 llblgen 与 EF 等其他一些 ORM 之间的一大区别。
  • @Zidad 感谢您的想法。不幸的是,不起作用。我还有多余的查询。

标签: c# linq orm llblgenpro llblgen


【解决方案1】:

如果您使用主实体的分配和详细实体的 AddRange 添加相关实体,则会自动构建对象关系图。

这是一个伪代码示例:

foreach aEntity in aCollection
   aEntity.BEntity = bCollection.First(x=>x.Id == aEntity.bId);

OR

foreach bEntity in bCollection
   bEntity.AEntity.AddRange(aCollection.Where(x=>x.bId == bEntity.Id));

完成此操作后,您的对象图就完成了。

【讨论】:

  • 抱歉,回复晚了,但这也不起作用。仅当图形在主节点上链接时才有效。如果图中有更深的共享节点,则它们没有链接。不知道如何在 SO 评论中表达这一点:)
【解决方案2】:

由于您已经在使用 Context,您可以稍后使用 PrefetchPath and context 加载 PrefetchPath,这样您的实体始终是链接的。然后,您可以运行 Linq2Objects 查询以在内存中加载所有 B。

var bs = aCollection.Select(x => x.B).ToList();

【讨论】:

  • 我是否正确,这将为每个 A 项目生成一个数据库查询?
  • 谢谢,但该段是关于重新加载具有附加数据的实体。这意味着我必须重新获取我试图避免的所有数据。我试图那样做,但要么不可能,要么我不知道该怎么做。你能发布一个加载集合的代码示例吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2020-08-19
  • 2011-12-16
相关资源
最近更新 更多