NHibernate JoinAlias 多次收集

NHibernate JoinAlias on collection multiple times

我在 Postgre 9.2 中使用 NHibernate 3.33 和 QueryOver。 我有两个实体:

public class User {
    public virtual string Name { get; set; }
    public virtual IList<Reports> Reports { get; set; }
}

public class Report {
    public virtual string Type { get; set; }
    public virtual DateTime ReportDate { get; set; }
    public virtual User Author { get; set; }
}

具有关联 - 一对多(我没有将其他字段附加到实体,例如上面的代码片段的 Id 或 Name)。某些报告类型可用 - 月、日。 我的目标是为用户获取摘要 - 了解用户是否有当天的日报告和月报告。

注意:月度报告的 ReportDate 看起来像一个月的第一天。我也想把它作为一行 (如果它是 SQL) 转换为 dto:

public class UserSummaryDto {
    public bool HasDayReport { get; set; }
    public bool HasMonthReport { get; set; }
}

为了实现我的目标,我尝试了以下方法:

Report dayReport = null;
Report monthReport = null;
var currentDay; // some value of current day
var firstDay; // some value of first day of month
var report = session.QueryOver<User>
    .Left.JoinAlias(u => u.Reports, () => dayReport, r => r.ReportDate == currentDay)
    .Left.JoinAlias(u => u.Reports, () => monthReport, r => r.ReportDate == firstDat)
    .SelectList(
        // some logic to check whether user has reports
.TransformUsing(Transformers.AliasToBean<UserSummaryDto>())
.List<UserSummaryDto>()

我有错误:

'duplicate association path:Reports'.

是否可以避免这个问题或者这是 HNibernate 的限制?

回答你的问题:

...Is it possible to avoid this problem or it's a limitation of HNibernate?

不得不说NO

有关更多信息,请参阅类似的问答:Rename NHibernate criteria

我们不查询数据库,不使用 SQL (这确实允许做很多事情)。在这里,我们使用 "mapped" 域模型,这可能会带来一些限制 - 正如此处讨论的那样...

如果这有帮助,解决方法是将 属性 映射两次并使用 WHERE 子句:6.2. Mapping a Collection

where="" (optional) specify an arbitrary SQL WHERE condition to be used when retrieving or removing the collection (useful if the collection should contain only a subset of the available data)