「DateCreated」というプロパティを含む抽象基本クラスがあります。いくつかの子クラスがあり、それらのいくつかは互いにリンクしています。
子クラスの 1 つに対してクエリを実行しようとすると、複数のテーブルに含まれているため、DateCreated であいまいな列エラーが発生します。
基準の抜粋を次に示します。
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty(Item.LinkField + ".Id"), "Measure")
.Add(Projections.Count("Id"), "StatCount")
.Add(Projections.GroupProperty("lnk." + Item.LinkTextField), "MeasureText")
.Add(Projections.SqlGroupProjection("MONTH(DateCreated) As [period]", "MONTH(DateCreated)", new[] { "period" }, new IType[] { NHibernateUtil.Int32 })))
サブクラスとその親の間の結合のエイリアスを基準の一部として指定する方法はありますか? CreateAlias
結合プロパティがないため、機能しないと思います。
にプレフィックス
{alias}.
を付けると、生成された SQL のDateCreated
プレフィックスになります。これは現在のテーブルのエイリアスですが、フィールド_this
を含む親テーブルのエイリアスではないため、列が見つかりません。DateCreated
生成された SQL で NHibernate が親テーブルに与えるエイリアスの前にプレフィックス
this_1_.
を付けるDateCreated
と、クエリは機能しますが、それはおそらく悪い考えだと思います。
NHibernate から生成された SQL は次のとおりです。
SELECT TOP (5) this_.incidenttype_id AS y0_,
Count(this_.module_id) AS y1_,
lnk1_.dicttext AS y2_,
Month(this_1_.datecreated) AS [StatFrequency]
FROM tblincident this_
INNER JOIN tblmodule this_1_
ON this_.module_id = this_1_.id
INNER JOIN tbldict lnk1_
ON this_.incidenttype_id = lnk1_.id
LEFT OUTER JOIN tbldictcode lnk1_1_
ON lnk1_.id = lnk1_1_.dict_id
LEFT OUTER JOIN tbldictimage lnk1_2_
ON lnk1_.id = lnk1_2_.dict_id
LEFT OUTER JOIN tbldictsdscategory lnk1_3_
ON lnk1_.id = lnk1_3_.dictimage_id
WHERE this_1_.customer_id = 2
AND this_1_.isarchive = 0
AND this_1_.isactive = 1
AND this_1_.isconfidential = 0
AND this_.incidentdate BETWEEN '2012/01/01' AND '2013/04/01'
AND this_1_.isactive = 1
AND this_1_.customer_id = 2
AND this_1_.orgunit_id BETWEEN 3 AND 1000
GROUP BY this_.incidenttype_id,
lnk1_.dicttext,
Month(this_1_.datecreated)
この例では、tblIncident は tblModule のサブクラスです。 DateCreated は tblModule に含まれています。「{alias}」を使用すると「this_1」が出力され、エラーが発生します。
明らかに、そのエイリアスを指定する方法が必要です。