如何在LLBLGen中合并实体图
本文关键字:合并 实体图 LLBLGen | 更新日期: 2023-09-27 18:20:57
假设我有两个表,A和B的关系为1-0..1。我使用适配器方法。我需要在一个地方加载a实体的集合,然后为所有a实体加载所有相关的B实体。不使用预取的原因是,在大多数情况下,我不需要加载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
,反之亦然。我希望这些引用被设置,因此这两个图被合并为一个图。
我可以使用LINQ to Objects连接两个集合,但这并不优雅,此外,如果两个集合都包含需要建立互连的复杂图,这可能会变得更加复杂。
我可以写一个从B到a的预取,但这是一个完全不必要的额外DB查询。
有没有一种简单的方法可以合并这两张图?
如果使用主实体的赋值和细节实体的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));
完成此操作后,对象图就完成了。
由于您已经在使用Context,您可以稍后使用PrefetchPath和Context加载PrefetchPath,这样您的实体总是链接的。然后,您可以运行Linq2Objects查询以在内存中加载所有B。
var bs = aCollection.Select(x => x.B).ToList();