我需要急切地获取具有集合集合等的实体,以便我可以同时处理数据(一个具有许多 YELLOWEntities 的事物实体,每个实体都有许多 SubYellowEntities)。所需的关键代码是:
NHibernateUtil.Initialize(fetchedThings);
(请参阅下面接受的答案。)
我需要急切地获取具有集合集合等的实体,以便我可以同时处理数据(一个具有许多 YELLOWEntities 的事物实体,每个实体都有许多 SubYellowEntities)。所需的关键代码是:
NHibernateUtil.Initialize(fetchedThings);
(请参阅下面接受的答案。)
目前的方法存在几个问题。让我重新审视一下这个问题。
据我了解,您正在寻找Things
具有多对一的检索BlueEntities
和 的集合YellowEntities
,而后者又具有 的集合SubYellowEntities
。
join fetch
您应该研究批量获取实体和集合,而不是使用、转换器和循环。
为和设置好的批量大小BlueEntity
后,您根本不需要 TPL 的东西。Thing.YellowEntities
YellowEntity.SubYellowEntities
如果事实证明您这样做了,您将无法返回可安全使用的实体,因为它们必须与单个会话相关联才能有用,并且会话不是线程安全的。
解决方案(如果您可以对此进行改进,请继续发布修订作为答案): 在 8 个处理器上运行 17 秒(低于 97 秒),结果正确。请记住,绝大多数时间都花在了计算上,而不是等待 Nhibernate 返回。
var fetchedThings = new List<Thing>();
var sessFT = Session.SessionFactory.OpenSession();
Task getThingsTask = new Task(() =>
{
fetchedThings = sessFT.CreateQuery(@" from Thing t " +
" inner join fetch t.BlueEntity " )
.SetResultTransformer(Transformers.DistinctRootEntity)
.List<Thing>();
NHibernateUtil.Initialize(fetchedThings);
});
getThingsTask.Start();
var fetchedYellows = new List<YELLOWEntity>();
var sessFY = Session.SessionFactory.OpenSession();
Task getYellowsTask = new Task(() =>
{
fetchedYellows = sessFY.CreateQuery(@" from YELLOWEntity y " +
" left join fetch y.SubYellowEntities " + ... )
.SetResultTransformer(Transformers.DistinctRootEntity)
.List<YELLOWEntity>();
NHibernateUtil.Initialize(fetchedThings);
});
getYellowsTask.Start();
getThingsTask.Wait();
getYellowsTask.Wait();
Parallel.ForEach(fetchedThings, thing =>
{
thing.YELLOWEntities = fetchedYellows.Where(y=>y.Thing.Id == thing.Id).ToList();
...
//...inner foreach() loop through 'YELLOWthings'... doing threadsafe stuff
...
});
//dispose the temp sessions