C# NHibernate查询覆盖和子查询的问题

C# NHibernate查询覆盖和子查询的问题,c#,nhibernate,queryover,C#,Nhibernate,Queryover,我有以下型号: 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>

我有以下型号:

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; }
}
公共类用户
{
公共虚拟整数Id{get;set;}
公共虚拟字符串用户名{get;set;}
公共虚拟字符串密码{get;set;}
公共虚拟字符串电子邮件{get;set;}
公共IList注释{get;set;}
}
公共类提交说明
{
公共虚拟Int64 Id{get;set;}
公共虚拟字符串文本{get;set;}
公共虚拟日期时间CreatedOn{get;set;}
公共虚拟用户创建者{get;set;}
公共虚拟提交属于{get;set;}
}
公开课提交
{
公共虚拟Int64 Id{get;set;}
公共虚拟日期时间发生在{get;set;}
公共虚拟int状态码{get;set;}
}
我想写一个查询,其中包含一些用户或用户列表(通过他们的姓名识别)输入了最后一个注释的所有提交。非常感谢您使用NHibernate QueryOver API构建此查询。我已经能够创建一个查询,将所有最后的注释带出,如下所示:

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();
SubmissionNote别名=null;
var lastNote=session.QueryOver()
.SelectList(list=>list)。
选择Group(x=>x.BelongsTo)。带别名(()=>alias.BelongsTo)。
选择max(x=>x.CreatedOn).WithAlias(()=>alias.CreatedOn)。
选择(x=>x.Creator).WithAlias(()=>alias.Creator)。
选择(x=>x.Id).WithAlias(()=>alias.Id)。
选择(x=>x.Text).WithAlias(()=>alias.Text))
.TransformUsing(Transformers.AliasToBean())
.List();

我可以使用指定的查询作为子查询来生成所需的结果吗?或者你建议另一种解决方案吗?

我会在子查询中尝试类似的方法(尽管没有经过测试)


希望这会有所帮助。子查询返回日期而不是id时可能会出现问题。LMK,我将查看一下。

我尝试了该查询,结果似乎有效。你的提问让我有些不知所措,因为我的直觉告诉我,我将不得不使用一个小组来完成我的任务。你能解释一下这个查询的逻辑吗?@Ikaso我用生成的SQL查询的草图更新了我的答案。也许您可以使用中间DTO来存储group by的结果,从而获得相同的结果。我对答案很感兴趣
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();
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)