任意の左の結合は現在linq-to-nhibernateでサポートされていません(v4.1)。 LINQ GroupJoin
に変換すると、linq-to-nhibernateと一緒に使用するとNotImplementedException
がスローされます。
answerで書かれているように、Davidでリンクされている場合は、代わりにqueryoverを使用できます。平野hqlもそうです。
代わりに、サービスポイントにメーターをマッピングすることができます。それは希望(あなたDimAccount
プロパティなし)のようになります。
public class DimServicePoint
{
public virtual int ServicePointID { get; set; }
public virtual int StartDayID { get; set; }
public virtual int EndDayID { get; set; }
public virtual int ServicePointKey { get; set; }
public virtual ISet<DimServicePointMeter> ServicePointMeters { get; set; }
}
public class DimServicePointMeter
{
public virtual int ServicePointMeterID { get; set; }
public virtual int ServicePointKey { get; set; }
}
でマッピング:
<class name="DimServicePoint">
<id name="ServicePointID">
<generator class="assigned" />
</id>
<property name="StartDayID" />
<property name="EndDayID" />
<property name="ServicePointKey" />
<set name="ServicePointMeters" inverse="true" batch-size="20">
<key column="ServicePointKey" property-ref="ServicePointKey" />
<one-to-many class="DimServicePointMeter" />
</set>
</class>
<class name="DimServicePointMeter">
<id name="ServicePointMeterID">
<generator class="assigned" />
</id>
<property name="ServicePointKey" />
</class>
そしてあなたとあなたのデータを得ることができる:
var spq = session.Query<DimServicePoint>()
.Where(sp => sp.ServicePointID == servicePointID && sp.DimAccount.AccountKey != 0 &&
sp.StartDayID <= currentDateId && sp.EndDayID >= currentDateId);
は、クエリ結果に.ServicePointMeters
へのアクセスロードされたサービスポイントの最大20収集のためにメーターコレクションの遅延ロードをトリガーする。これは私が提案したマッピングのbatch-size
属性によるものです。これがなくても(グローバルに設定されていなければbatch-size
)、一度に1つのコレクションのみの遅延負荷が発生し、パフォーマンス上の問題がn + 1になる可能性があります。
あなたが熱心に代わりにそれらをロードしたい場合は、単にフェッチを追加します。
var spq = session.Query<DimServicePoint>()
.Where(sp => sp.ServicePointID == servicePointID && sp.DimAccount.AccountKey != 0 &&
sp.StartDayID <= currentDateId && sp.EndDayID >= currentDateId)
.FetchMany(sp => sp.ServicePointMeters);
結果のクエリは、左の参加を使用します。
注:
私は個人的にLINQのSQLに似た構文を避ける私の答えに示したように、私は、LINQの拡張メソッドの使用を好みます。私はそれらをはるかに読みやすいと感じる。
私はNHibernateを熱心にロードするよりも遅延ロードを優先します。私はhereを説明したように、良いパフォーマンスを維持しながらコードを単純化する傾向があります。
http://stackoverflow.com/a/15590126/1162077 –