0

我需要急切地获取具有集合集合等的实体,以便我可以同时处理数据(一个具有许多 YELLOWEntities 的事物实体,每个实体都有许多 SubYellowEntities)。所需的关键代码是:

NHibernateUtil.Initialize(fetchedThings);

(请参阅下面接受的答案。)

4

2 回答 2

0

目前的方法存在几个问题。让我重新审视一下这个问题。

据我了解,您正在寻找Things具有多对一的检索BlueEntities和 的集合YellowEntities,而后者又具有 的集合SubYellowEntities

join fetch您应该研究批量获取实体和集合,而不是使用、转换器和循环。

为和设置好的批量大小BlueEntity后,您根本不需要 TPL 的东西。Thing.YellowEntitiesYellowEntity.SubYellowEntities

如果事实证明您这样做了,您将无法返回可安全使用的实体,因为它们必须与单个会话相关联才能有用,并且会话不是线程安全的。

于 2012-08-21T19:29:53.390 回答
0

解决方案(如果您可以对此进行改进,请继续发布修订作为答案): 在 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
于 2013-01-09T15:52:44.643 回答