在Visual Studio中调试期间,您能在查询中查看NHibernate结果吗?

时间:2017-12-01 11:43:48

标签: c# nhibernate fluent-nhibernate

多年来我一直在使用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语句将其拉出来?

1 个答案:

答案 0 :(得分:1)

您发布的QueryOver似乎缺少了哪个部分 sessionAlias别名已分配给某些内容。

正在为其他人完成(除了eventAlias似乎完全未使用),需要将别名分配给通过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);