2

我有以下域模型

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]
4

2 回答 2

1

这可能有效,但我无法测试它

Master mast=null;

var query = NHibernateSessionManager.Instance.GetSessionFrom()
    .QueryOver(() => mast)
    .Where(() => mast.Name == "Josh")
    .SelectList(l =>
        l.SelectSubQuery(QueryOver.Of<Widget>()
            .JoinQueryOver(widg => widg.AppliesTo)
                .Where(obj => obj.Id == mast.Id)
            .Select(Projections.Max<Widget>(widg => widg.DateCreated))
        )
    );
于 2013-08-06T11:33:10.970 回答
0

到目前为止,我设法做的最好的事情是使用 Sql Projection 来添加它。

    .Select(Projections.SqlProjection(
    "(select max(datecreated) from Widget wid
     inner join WidgetAppliesTo widTo on wid.Id=widTo.ActivityId and widTo.ObjectId=this_.Id)
 as lastTouchDate",
new string[]{"lastTouchDate"},
new NHibernate.Type.IType[]{NHibernateUtil.DateTime})
.WithAlias(() => jobDto.LastTouchDate));

虽然这可行,但我希望看到一个非黑客解决方案

于 2012-10-19T17:36:07.673 回答