我有以下域模型
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; }
}
小部件映射已将 ApplysTo 定义为:
<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>
我正在使用 Master 上的 QueryOver 编写查询,并且我想提取适用于 Master 的任何 Widget 的最后一个 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]