【发布时间】:2011-08-11 16:29:55
【问题描述】:
首先,我确信必须有一个简单的解决方案,但我就是找不到。 (是的,我已经用谷歌搜索过了)
如果我运行这个标准..
IList<Team> teams = session.CreateCriteria<Team>("t")
.CreateCriteria("t.TeamMembers", "m")
.Add(Expression.Eq("m.Enabled", true))
.List<Team>();
..生成的SQL类似于:
SELECT t.*, m.* FROM Teams t INNER JOIN TeamMembers m ON t.ID = m.TeamID
因为我只需要表 Teams 中的列。如何指示 NHibernate 停止从 TeamMembers 获取未使用的列?
(我的实际实现非常复杂,会返回大量数据,因此为了简洁起见,这是一个简化示例)
编辑:“添加:.Add(Expression.Eq("m.Enabled", true))”到标准
这是我使用相同设置进行的测试:
类:
public class Team
{
public virtual int ID { get; private set; }
public virtual Iesi.Collections.Generic.ISet<Member> Members { get; set; }
}
public class Member
{
public virtual int ID { get; private set; }
public virtual bool Enabled { get; set; }
public virtual Team Team { get; set; }
}
映射:
<class xmlns="urn:nhibernate-mapping-2.2" name="TestApp.Team, ClassLib" table="`Team`">
<id access="backfield" name="ID" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
<generator class="identity" />
</id>
<set lazy="true" name="Members">
<key>
<column name="TeamID" />
</key>
<one-to-many class="TestApp.Member, ClassLib" />
</set>
</class>
<class xmlns="urn:nhibernate-mapping-2.2" name="TestApp.Member, ClassLib" table="`Member`">
<id access="backfield" name="ID" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
<generator class="identity" />
</id>
<property name="Enabled" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Enabled" />
</property>
<many-to-one class="TestApp.Team, ClassLib" name="Team">
<column name="TeamID" />
</many-to-one>
</class>
生成的 SQL:
SELECT this_.ID as ID11_1_, m1_.ID as ID10_0_, m1_.Enabled as Enabled10_0_, m1_.TeamID as TeamID10_0_ FROM "Team" this_ inner join "Member" m1_ on this_.ID=m1_.TeamID WHERE m1_.Enabled = @p0;@p0 = True [Type: Boolean (0)]
澄清说明:在我的测试示例中,我顺便将TeamMembers 命名为Members。
【问题讨论】:
-
TeamMembers 集合是否懒惰?
标签: nhibernate icriteria