简体   繁体   中英

How to merge entity graphs in LLBLGen?

Let's assume I have 2 tables, A and B with 1-0..1 relation. I use the Adapter approach. I need to load a collection of A entities in one place, and then load all related B entities for all A entities later. The reason to not use Prefetch is that in most cases I will not need to load B entities.

I use LINQ everywhere, so I would like to do it the same way.

The code I am trying to write looks like this:

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

The problem is that bCollection and aCollection stay unlinked, ie all A entities have B = null and vice versa. I want these references to be set, and therefore the 2 graphs to be united into a single one.

I can join 2 collections using LINQ to Objects, but that's not elegant, and besides this might get much more complicated if both collections contain complex graph with interconnections that need to be established.

I can write a prefetch from B to A, but that's one extra DB query that is completely unnecessary.

Is there an easy way to get these 2 graphs merged?

Object relation graph is built automatically if you add related entities using assignment for master entity and AddRange for detail entities.

Here's a pseudo-code sample:

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

After doing this your object graph is complete.

Since you are already using a Context, you can use PrefetchPath and context to load the PrefetchPath later, that way your entities are always linked. Then you can run a Linq2Objects query to load in-memory all B's.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM