回答

收藏

NHibernate未来对象图有很多查询

技术问答 技术问答 213 人阅读 | 0 人回复 | 2023-09-13

给定一个使用Future调用的多层对象图:
7 P* d/ u) `0 n) y' V( z6 Fvar Dads = db.Session.Query().Where(P => P.EntityKey == Id)
7 b+ N1 e+ o" ^/ B  C             .ToFuture();
% H3 k8 T0 y2 ovar Kids = db.Session.Query().Where(K => K.Parent.EntityKey == Id)* E8 x3 T1 u. b: J3 K4 u, ?: b
             .ToFuture();4 L1 ~' ]$ c8 Q
当我调用var Dad = dads.ToList()时,我看到该批生产线穿过了,并在探查器中显示。
4 @# ~+ a1 @% L问题是在枚举集合时它仍向数据库发送一次查询) m' t- x& H8 _: S: e6 W+ T2 O* y6 z1 V
例如。
% L* R2 |; K4 l% X' c0 tfor each (Kid kid in Dad.Kids) // This seems to hit the database 5 F1 E9 N+ ^- T8 ?
{
0 S. k! o( [& p4 q! W# v0 q   Teach(kid);
; Q4 O4 v! X' n2 I+ v1 B2 N}
; n4 d. A/ i* o3 G3 Y# p$ Y# H发送一个SQL查询并访问数据库以获取每个孩子。为什么未填充对象图?还是这种预期的行为?0 |8 q& b' J- R
               
& g' I" x9 ]3 |, g9 H解决方案:- L8 B  i/ Q- M: g. Z
                ; P; ]/ @- A, U
& l0 I$ s: F; O: u/ I! W6 f

5 B( S4 t5 j1 v/ s. o                这种行为是可以预期的。您只是在告诉NHibernate从数据库中批量获取两个集合,这就是按照所告知的那样进行的。但是,您并没有告诉他们它们是相关的。NH带有期货的查询不会在执行实体后将它们放在一起,除非被告知要通过联接将它们放在一起。  h& q2 K& S  L* T& F9 |
如果您在没有期货的情况下执行了单独的查询,则您不会期望父实体突然将子集合填满。基本上,期货允许您一次往返交易。如果查询恰好具有多个子集合的公共根(例如,避免使用笛卡尔积),则NH能够将多个集合“组合”为一个实体。9 w4 x4 n. k2 E; P. \
不幸的是,与NH LINQ Api一起使用时,该ToFuture()方法似乎在当前(NH
7 @% s4 V; u5 r0 ~. ^: h% Z3.0或3.1)实现中带来了问题。在这种情况下,您可能需要使用QueryOver Api。
. Y* }! c! a9 N, d2 T  U4 [附带一提,我认为方法名称不合适。1 E4 a) r8 C5 K, H6 L
编辑:问题编辑后,方法名称现在确定。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则