假设我有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
,反之亦然。我希望设置这些引用,因此将两个图组合成一个。
我可以使用LINQ to Objects加入2个集合,但这并不优雅,而且如果两个集合都包含需要建立互连的复杂图形,这可能会变得更加复杂。
我可以将B中的预取写入A,但这是一个额外的数据库查询,完全没有必要。
是否有一种简单的方法可以合并这两个图表?
答案 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();