多年来我一直在使用Entity Framework,我刚刚被一个使用NHibernate的项目深深抛入,我真的很挣扎。如果您是第一次使用它,那么文档很少且无用,大多数教程和示例网站都已过时 - 我知道它在v3中发生了重大变化吗?
通常情况下,我在尝试与他们合作时学得最好,所以我跳进来试图看看我能做些什么。但我在这个预先存在的函数中遇到了一个错误(这个代码都不是我的):
public IDictionary<long, string> GetSeriesFilterData(string userId)
{
Series seriesAlias = null;
Event eventAlias = null;
Session sessionAlias = null;
Dealership dealershipAlias = null;
var query = _repository.Session.QueryOver(() => seriesAlias)
.Where(() => !seriesAlias.IsArchived);
var dealershipIds = QueryOver.Of<ApplicationUserDealership>()
.Where(x => x.ApplicationUser_Key == userId)
.SelectList(list => list.SelectGroup(x => x.Dealership_Id));
dealershipIds.Where(x => x.Dealership_Id == dealershipAlias.Id);
query
.JoinAlias(() => sessionAlias.Dealership, () => dealershipAlias, JoinType.LeftOuterJoin)
.WithSubquery.WhereExists(dealershipIds);
var results = query.SelectList(x => x
.SelectGroup(() => seriesAlias.Id)
.SelectGroup(() => seriesAlias.Name))
.List<object[]>()
.ToDictionary(x => (long) x[0], x => (string) x[1]);
return results;
}
收集结果时抛出的异常是:
类型&#39; NHibernate.QueryException&#39;的例外情况发生在NHibernate.dll但未在用户代码中处理
其他信息:无法解析属性:sessionAlias
我怀疑这是因为经销商ID是空的,但我很难证明这是事实。使用Entity Framework,可以通过解压缩其对象图来在调试期间查看查询结果。但是,我似乎无法在NHibernate中这样做。
是否可以通过调试查看查询片段的结果,还是必须使用Select语句将其拉出来?
答案 0 :(得分:1)
您发布的QueryOver似乎缺少了哪个部分
sessionAlias
别名已分配给某些内容。
正在为其他人完成(除了eventAlias
似乎完全未使用),需要将别名分配给通过JoinAlias
/查询的实体类的属性/路径JoinQueryOver
或使用seriesAlias
在QueryOver创建时完成的实体本身。
然后,该别名(变量)可用于Where
,OrderBy
等。
例如,假设Session是从Series
的属性引用的实体(没有关于您的实际实体模型的线索),以下将解决您的问题,因为它将sessionAlias
绑定到该属性:
// This binds the alias to the property.
query.JoinAlias(s => s.Session, () => sessionAlias);
// This is the same as above, but uses the previously defined alias for the main entity,
// just to show how aliases can be used.
query.JoinAlias(() => seriesAlias.Session, () => sessionAlias);