Hi All,
 
I have basic performance question about NHibernate.
 
Suppose two simple test tables:
 
CREATE TABLE "TestMaster"
(
  "IdM" serial NOT NULL,
  "Text" character varying(20),
  CONSTRAINT "PK_TestMaster" PRIMARY KEY ("IdM" )
);
 
CREATE TABLE "TestDetail"
(
  "IdD" serial NOT NULL,
  "IdM" integer NOT NULL,
  "Text" character varying(30),
  CONSTRAINT "PK_TestDetail" PRIMARY KEY ("IdD" ),
  CONSTRAINT "FK_TestDetail_TestMaster" FOREIGN KEY ("IdM")
      REFERENCES "TestMaster" ("IdM") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE RESTRICT
);
 
for these two tables I have these two mappings:
 
  <class name="TestMaster" schema="public" table="`TestMaster`" lazy="true">
    <id name="IdM" column="`IdM`" />
    <property name="Text" column="`Text`" />
    <bag name="ListTestDetail" schema="public" table="`TestDetail`" 
inverse="true" cascade="all-delete-orphan">
      <key column="`IdM`" />
      <one-to-many class="TestDetail" />
    </bag>
  </class>
  <class name="TestDetail" schema="public" table="`TestDetail`" lazy="true">
    <id name="IdD" column="`IdD`" />
    <property name="Text" column="`Text`" />
    <many-to-one name="LinkTestMaster" class="TestMaster" column="`IdM`" />
  </class>
and two classes:
 
 public class TestMaster
 {
  public virtual int IdM { get; set; }
  public virtual string Text { get; set; }
  public virtual IList<ORM.TestDetail> ListTestDetail { get; set; }
 }
 
 public class TestDetail
 {
  public virtual int IdD { get; set; }
  public virtual String Text { get; set; }
  public virtual TestMaster LinkTestMaster { get; set; }
 }
Suppose there are 1000 rows in the TestMaser table. If I run this code:
 
using (ISession ormSession = OrmSessionFactory.OpenSession()) {
 IList<ORM.TestMaster> lm = ormSession.CreateQuery("from 
TestMaster").List<ORM.TestMaster>();
  int cnt = 0;
 foreach (ORM.TestMaster tm in lm) {
  cnt += tm.ListTestDetail.Count;
 }
}

then I see 1+1000 selects in the output window (I know why - first select 
for the TestMaster table and 1000 selects for TestDetail where IdM=... when 
I evaluate the detail records) and the performance is very low. I tried to 
change the test code to:
 
using (ISession ormSession = OrmSessionFactory.OpenSession()) {
 IList<ORM.TestMaster> lm = ormSession.CreateQuery("from 
TestMaster").List<ORM.TestMaster>();
 *IList<ORM.TestDetail> ld = ormSession.CreateQuery("from 
TestDetail").List<ORM.TestDetail>();*
 int cnt = 0;
 foreach (ORM.TestMaster tm in lm) {
  cnt += tm.ListTestDetail.Count;
 }
}
in order to read all TestDetail records into the NHibernate's inner memory 
(and let him read TestDetail records from inner memory instead of database) 
but no success.
 
Is there some way I can convert scenario 1+1000 to 1+1 (1st select for 
TestMaster, 2nd select for TestDetail)?
 
I'm sure this behavior comes from my misunderstandig and low NH knowledge, 
but I was not able to find the solution in this group.
 
Thank you
 
IvoD

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to