NHibernate使用Linq或QueryOver将子实体投影到父属性中

NHibernate使用Linq或QueryOver将子实体投影到父属性中,nhibernate,linq-to-nhibernate,nhibernate-projections,queryover,Nhibernate,Linq To Nhibernate,Nhibernate Projections,Queryover,也许这很简单,但我一直坚持着,我没有找到任何关于如何做到这一点的答案。我有一个具有子实体操作集合的父实体用户。这两个实体仅用于UI,因此它们是一组视图。这是伪代码 public class User { public int Id {get; set;} public IEnumerable<Operation> Operations {get; set;} public int TotalSuccessfulAccesses {get; set;} // not

也许这很简单,但我一直坚持着,我没有找到任何关于如何做到这一点的答案。我有一个具有子实体操作集合的父实体用户。这两个实体仅用于UI,因此它们是一组视图。这是伪代码

public class User
{
   public int Id {get; set;}
   public IEnumerable<Operation> Operations {get; set;}
   public int TotalSuccessfulAccesses {get; set;} // not mapped to the database
   public int TotalFailedAccesses {get; set;}     // not mapped to the database
}

public class Operation
{
   public int Id {get; set; }
   public int UserId {get; set; } // FK
   public int NbSuccessfulAccesses {get; set; }
   public int NbFailedAccesses {get; set; }
}
公共类用户
{
公共int Id{get;set;}
公共IEnumerable操作{get;set;}
public int TotalSuccessfulAccess{get;set;}//未映射到数据库
public int TotalFailedAccess{get;set;}//未映射到数据库
}
公营课运作
{
公共int Id{get;set;}
public int UserId{get;set;}//FK
public int nbsuccessfulAccess{get;set;}
public int nbfailedAccess{get;set;}
}
我想做的是让用户在一次到数据库的往返过程中从子集合初始化TotalSuccessfulAccess和TotalFailedAccess

对于每个用户,我们应该计算Sum(Operation.nbsuccessfulAccess)Sum(Operation.nbfailedAccess),并分别对用户.totalsuccessfulAccess和用户.totalfailedAccess进行预测

我尝试使用多标准和一些查询,但我并不满意。我想知道是否有一种简单的方法可以通过投影或其他方式来实现。也许我错过了什么

你推荐什么


提前感谢您的帮助。

您可能需要分离视图模型和域实体。我假设在您的域中有一个用户类,它有一个操作列表,并且这些实体被相应地映射

然后可以创建视图模型:

public class UserViewModel
{
    public int UserId { get; set; }
    public int TotalSuccessfulAccesses { get; set; }
    public int TotalFailedAccesses {get; set;}
}
使用ICriteria可以创建以下查询:

var criteria = Session.CreateCriteria(typeof(User));
criteria.CreateAlias("Operations", "operations", JoinType.LeftOuterJoin);

var projList = Projections.ProjectionList();

projList.Add(Projections.GroupProperty("Id"));
projList.Add(Projections.Sum("operations.NbSuccessfulAccesses"), "TotalSuccessfulAccesses"); 
projList.Add(Projections.Sum("operations.NbFailedAccesses"), "TotalFailedAccesses");

criteria.SetProjection(projList);
criteria.SetResultTransformer(Transformers.AliasToBean<UserViewModel>());

var ret = criteria.List<UserViewModel>();
var-criteria=Session.CreateCriteria(typeof(User));
CreateAlias(“操作”、“操作”、JoinType.LeftOuterJoin);
var projList=Projections.ProjectionList();
projList.Add(projects.GroupProperty(“Id”));
projList.Add(Projections.Sum(“operations.nbsuccessfulAccess”)、“totalsuccessfulAccess”);
项目列表添加(projects.Sum(“operations.nbfailedAccess”),“totalfailedAccess”);
标准。设置投影(项目列表);
标准.SetResultTransformer(Transformers.AliasToBean());
var ret=criteria.List();
根据需要创建视图模型,并相应地在投影列表中添加任何属性


希望能有所帮助。

多亏了凯,我想出了以下翻译:

Operation operations = null;
var q = GetSession().QueryOver<User>().Where(u => u.AccessKeyId == accessKeyId)
                    .Left.JoinQueryOver(x => x.Operations, () => operations)
                    .Select(Projections.ProjectionList()
                        .Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses), "TotalSuccessfulAccesses"))
                        .Add(Projections.Sum<User>(x => operations.NbFailedAccesses), "TotalFailedAccesses"))
                    .TransformUsing(Transformers.AliasToBean<UserViewModel>()).List< UserViewModel >();
操作=null;
var q=GetSession().QueryOver()。其中(u=>u.AccessKeyId==AccessKeyId)
.Left.JoinQueryOver(x=>x.Operations,()=>Operations)
.Select(Projections.ProjectionList())
.Add(Projections.Sum(x=>operations.nbsuccessfulAccess),“totalsuccessfulAccess”))
.Add(projects.Sum(x=>operations.nbfailedAccess),“totalfailedAccess”))
.TransformUsing(Transformers.AliasToBean()).List();
然而,我想知道是否有办法摆脱神奇的字符串“TotalSuccessfulAccess”和“TotalFailedAccess”

如果我用那样的东西

UserViewModel userView = null;

Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses),  () => userView.TotalSuccessfulAccesses)
UserViewModel userView=null;
添加(Projections.Sum(x=>operations.nbSuccessfulAccess),()=>userView.TotalSuccessfulAccess)
NHibernate产生一个错误:

在类“Domain.Query.UserViewModel”中找不到属性“userView.TotalSuccessfulAccess”的setter

这不是真的,因为TotalSuccessfulAccess的属性有一个setter

有什么想法吗


谢谢

我可以通过以下方式摆脱magic alias字符串:

UserViewModel userView = null;

Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses).WithAlias(() => userView.TotalSuccessfulAccesses))
UserViewModel userView=null;
添加(Projections.Sum(x=>operations.nbSuccessfulAccess).WithAlias(()=>userView.TotalSuccessfulAccess))

您使用的是NH的哪个版本?我使用的是NHibernateProjectList.Add的3.1版本(Projections.Sum(“operations.totalSuccessfulAccess”)不应该是projList.Add(Projections.Sum(“operations.nbsuccessfulAccess”)