在 Visual Studio 调试期间,您能否在查询中看到 NHibernate 结果?
Can you see NHibernate results mid-query during debugging in Visual Studio?
多年来一直舒适地使用 Entity Framework,我刚刚被一个使用 NHibernate 的项目深陷其中,我真的很挣扎。如果您是第一次使用该文档,它的文档很少且没有帮助,而且大多数教程和示例站点都已过时 - 我知道它在 v3 中发生了重大变化?
通常情况下,我在尝试与他们合作时会学到最好的东西,所以我加入并尝试看看我能做什么。但是我在这个预先存在的函数中遇到了一个错误(none 这段代码是我的):
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;
}
收集结果时抛出的异常是:
An exception of type 'NHibernate.QueryException' occurred in NHibernate.dll but was not handled in user code
Additional information: could not resolve property: sessionAlias
我怀疑这是因为 dealershipIds 为空,但我正在努力证明情况确实如此。使用 Entity Framework,可以在调试期间通过解压缩其对象图来查看查询结果。但是,我似乎无法在 NHibernate 中做到这一点。
是否可以通过调试查看查询片段的结果,或者我是否必须使用 Select 语句将其提取出来?
您发布的 QueryOver 似乎缺少
sessionAlias
别名已分配给某物。
因为这是为其他人完成的(eventAlias
除外,它似乎完全未使用)需要将别名分配给实体 class 上的 property/path,通过 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);
多年来一直舒适地使用 Entity Framework,我刚刚被一个使用 NHibernate 的项目深陷其中,我真的很挣扎。如果您是第一次使用该文档,它的文档很少且没有帮助,而且大多数教程和示例站点都已过时 - 我知道它在 v3 中发生了重大变化?
通常情况下,我在尝试与他们合作时会学到最好的东西,所以我加入并尝试看看我能做什么。但是我在这个预先存在的函数中遇到了一个错误(none 这段代码是我的):
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;
}
收集结果时抛出的异常是:
An exception of type 'NHibernate.QueryException' occurred in NHibernate.dll but was not handled in user code
Additional information: could not resolve property: sessionAlias
我怀疑这是因为 dealershipIds 为空,但我正在努力证明情况确实如此。使用 Entity Framework,可以在调试期间通过解压缩其对象图来查看查询结果。但是,我似乎无法在 NHibernate 中做到这一点。
是否可以通过调试查看查询片段的结果,或者我是否必须使用 Select 语句将其提取出来?
您发布的 QueryOver 似乎缺少
sessionAlias
别名已分配给某物。
因为这是为其他人完成的(eventAlias
除外,它似乎完全未使用)需要将别名分配给实体 class 上的 property/path,通过 JoinAlias
/JoinQueryOver
或实体本身,因为它是在使用 seriesAlias
.
然后,那个别名(变量)可以用在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);