次のドメインモデルがあります
public interface IAppliedTo
{
public Guid Id { get; set; }
}
public class Widget
{
public DateTime DateCreated { get; set; }
public Guid Id { get; set; }
public ISet<IAppliedTo> AppliesTo { get; set; }
}
public class Master : IAppliedTo
{
public Guid Id { get; set; }
}
ウィジェット マッピングには、AppliesTo が次のように定義されています。
<set name="AppliesTo" table="WidgetAppliesTo" lazy="true" >
<key column="WidgetId"></key>
<many-to-any id-type="Guid" meta-type="int" >
<meta-value class="Master" value="1"/>
<column name="ObjectType" />
<column name="ObjectId" />
</many-to-any>
</set>
マスターで QueryOver を使用してクエリを作成しており、マスターに適用されるウィジェットの最後の CreatedDate を取得したいと考えています。
基本的に私は次のようなものが欲しい:
Master mast=null;
Widget widg=null;
var widgetQuery=QueryOver.Of<Widget>(()=>widg);
var query = NHibernateSessionManager.Instance.GetSessionFrom()
.QueryOver<Master>(() => mast)
.Where(() => mast.Name == "Josh")
.SelectList(l =>
l.SelectSubQuery(widgetQuery.Where(() => widg.AppliesTo.Contains(mast))
.Select(Projections.Max(() => widg.DateCreated))
)
);
私の AppliesTo が特定の型である場合、これを行う方法はわかっていますが、nHibernate に ObjectId を使用するように指示するにはどうすればよいでしょうか。基本的に、私はこのクエリを取得しようとしています:
SELECT *,(SELECT MAX(DateCreated)
FROM Widget
INNER JOIN WidgetAppliesTo
on Widget.Id=WidgetAppliesTo.ActivityId
WHERE objectId=[master].Id)
FROM [Master]