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; }
}

ウィジェット マッピングには、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]
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 に答える