如何在LLBLGen中合并实体图?

时间:2014-09-08 07:48:36

标签: c# linq orm llblgenpro llblgen

假设我有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,反之亦然。我希望设置这些引用,因此将两个图组合成一个。

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

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

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

2 个答案:

答案 0 :(得分: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));

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

答案 1 :(得分:0)

由于您已经在使用Context,因此可以稍后使用PrefetchPath and context加载PrefetchPath,这样您的实体就会始终链接。然后你可以运行一个Linq2Objects查询来加载内存中的所有B&#39。

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