4

也许这很简单,但我坚持下去,我没有找到任何关于如何完成的答案。我有一个父实体用户,其中包含一组子实体操作。这两个实体仅用于 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; }
}

我想做的是在一次到数据库的往返中从子集合中初始化具有 TotalSuccesfulAccesses 和 TotalFailedAccesses 的用户。

对于每个用户,我们应该计算Sum(Operation.NbSuccessfulAccesses)Sum(Operation.NbFailedAccesse)并分别对User.TotalSuccesfulAccessesUser.TotalFailedAccesses进行投影。

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

你会推荐什么 ?

提前感谢您的帮助。

4

3 回答 3

4

我能够通过以下方式摆脱魔术别名字符串:

UserViewModel userView = null;

Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses).WithAlias(() => userView.TotalSuccessfulAccesses))
于 2011-05-04T14:55:55.603 回答
3

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

然后您可以创建一个视图模型:

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>();

根据您的需要创建视图模型,并相应地在投影列表中添加任何属性。

希望有帮助。

于 2011-04-27T09:29:03.227 回答
2

感谢凯,我想出了以下翻译:

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 >();

但是我想知道是否有办法摆脱魔术字符串“TotalSuccessfulAccesses”和“TotalFailedAccesses”。

如果我使用类似的东西

UserViewModel userView = null;

Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses),  () => userView.TotalSuccessfulAccesses)

NHibernate 产生一个错误:

在“Domain.Query.UserViewModel”类中找不到属性“userView.TotalSuccessfulAccesses”的设置器

这不是真的,因为 TotalSuccessfulAccesses 的属性有一个设置器。

有任何想法吗 ?

谢谢

于 2011-04-27T10:48:39.117 回答