我使用NHibernate 3.33和QueryOver和Postgre 9.2。 我有两个实体:
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; }
}
with association - one-to-many(我没有将附加字段附加到像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>()
我有错误:
&#39;重复的关联路径:报告&#39;。
是否可以避免这个问题,或者它是HNibernate的限制?
答案 0 :(得分:1)
回答你的问题:
...是否可以避免此问题或者是HNibernate的限制?
不得不说否。
有关更多信息,请参阅类似的Q&amp;答:Rename NHibernate criteria
我们不是在查询数据库,而是使用SQL (它允许做很多事情)。在这里,我们使用“映射”域模型,这可能会带来一些限制 - 正如这里讨论的那样......
如果这有帮助,解决方法是两次映射此类属性并使用WHERE子句:6.2. Mapping a Collection
where=""
(可选)指定在检索或删除集合时使用的任意SQL WHERE条件(如果集合应仅包含可用数据的子集,则非常有用) )