Как оптимизировать критерии ICriteria для выбора в NHIbernate?

Прежде всего, я уверен, что для этого должно быть простое решение, но я просто не могу его найти. (Да, я погуглил)

Если я выполню этот критерий ..

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 в моем тестовом примере.


person Jonas Stensved    schedule 11.08.2011    source источник
comment
такое коллекция TeamMembers Lazy?   -  person Pedro    schedule 11.08.2011


Ответы (1)


ОБНОВЛЕНО ДЛЯ ВОПРОСА ОБНОВЛЕНИЯ

Вероятно, лучше всего сделать коллекцию Members ленивой в конфигурации

<set name="Members" lazy="true">

а затем устанавливайте только в противном случае, когда это необходимо, например

.SetFetchMode("TeamMembers", FetchMode.Eager) 
person dove    schedule 11.08.2011
comment
Да это сложнее. Я обновил свой пример сопоставлениями, классами и сгенерированным sql. - person Jonas Stensved; 11.08.2011
comment
не могли бы вы сделать Членов ленивыми по умолчанию, это обычная практика, то есть ‹set name = Members lazy = true›? - person dove; 11.08.2011
comment
Обновлен с помощью lazy="true", но в сгенерированном SQL нет изменений? (Я использую активную загрузку только тогда, когда это необходимо, как вы предлагаете) - person Jonas Stensved; 12.08.2011
comment
Нашел здесь тот же вопрос (без ответа) stackoverflow.com/q/5296461/348841 - person Jonas Stensved; 12.08.2011