在 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 时完成的

然后,那个别名(变量)可以用在WhereOrderBy

例如,假设 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);