3

私は次のモデルを持っています:

public class User
{
    public virtual int Id { get; set; }
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual string Email { get; set; }
    public IList<SubmissionNote> Notes { get;set; }
}

public class SubmissionNote
{
    public virtual Int64 Id { get; set; }
    public virtual string Text { get; set; }
    public virtual DateTime CreatedOn { get; set; }
    public virtual User Creator { get; set; }
    public virtual Submission BelongsTo { get; set; }
}

public class Submission
{
    public virtual Int64 Id { get; set; }
    public virtual DateTime HappenedOn { get; set; }
    public virtual int StatusCode { get; set; }
}

一部のユーザーまたはユーザーのリスト(名前で識別)によって最後のメモが入力されたすべての提出物を取得するクエリを作成したいと思います。NHibernateQueryOverAPIを使用してこのクエリを作成するためにご協力いただければ幸いです。次のように、最後のメモをすべて表示するクエリを作成できました。

SubmissionNote alias = null;
var lastNote = session.QueryOver<SubmissionNote>()
    .SelectList(list => list.
        SelectGroup(x => x.BelongsTo).WithAlias(() => alias.BelongsTo).
        SelectMax(x => x.CreatedOn).WithAlias(() => alias.CreatedOn).
        Select(x => x.Creator).WithAlias(() => alias.Creator).
        Select(x => x.Id).WithAlias(() => alias.Id).
        Select(x => x.Text).WithAlias(() => alias.Text))
    .TransformUsing(Transformers.AliasToBean<SubmissionNote>())
    .List();

指定されたクエリをサブクエリとして使用して、必要な結果を生成できますか?または、別の解決策を提案しますか?

4

1 に答える 1

3

サブクエリでこのようなことを試してみます(ただし、テストされていません)

SubmissionNote subNoteAlias = null, subNoteAliasMax =null;
User userAlias = null;
String[] userNames = new[]{"John","Joe"};

var subquery =
    QueryOver.Of(() => subNoteAliasMax)
       .Where(subNote => subNote.BelongsTo.Id == subNoteAlias.BelongsTo.Id)
       .Select(Projections.Max<SubmissionNote>(subNote => subNote.CreatedOn));

var result = session
 .QueryOver<SubmissionNote>(() => subNoteAlias)
 .WithSubquery.WhereProperty(subNote=>subNote.CreatedOn).Eq(subquery)
 .JoinQueryOver(
      subNote=>subNote.Creator
      ,()=>userAlias
      ,JoinType.InnerJoin
      ,Restrictions.In(Projections.Property(() => userAlias.Username ), userNames))
  .List();

生成された SQL クエリは、(非常に) 大まかに次のようになります。

SELECT SubmissionNote.*
  FROM SubmissionNote INNER JOIN User
  ON SubmissionNote.creatorId = User.userId
  AND User.userName in ('john','joe')
  WHERE SubmissionNote.CreatedOn = (SELECT MAX(CreatedOn) FROM SubmissionNote snAlias     
     WHERE snAlias.SubmissionId = SubmissionNote.SubmissionId)

これが役立つことを願っています。ID ではなく日付を返すサブクエリに問題がある可能性があります。LMKと私が見てみましょう。

于 2013-01-16T09:57:19.443 に答える