1

假设我有 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 的预取,但这是一个完全没有必要的额外数据库查询。

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

4

2 回答 2

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));

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

于 2014-09-16T08:05:09.830 回答
0

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

var bs = aCollection.Select(x => x.B).ToList();
于 2014-09-09T15:51:51.290 回答