【发布时间】: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();
问题在于bCollection 和aCollection 保持未链接状态,即所有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