NHibernate和C#:使用带条件的嵌套属性时出错

NHibernate和C#:使用带条件的嵌套属性时出错,c#,nhibernate,hibernate-criteria,C#,Nhibernate,Hibernate Criteria,该场景是一个使用NHibernate与SQL Server数据库交互的MVC.NET应用程序 每个带有条件的NHibernate查询都可以正常工作,但我添加的最后一个查询除外,它会导致以下错误: 无法解析属性:Reading.Truck.Company.CompanyId of:ADO.Alarms 相关代码如下: session = NHibernateSessionManager.Instance.GetSession(); ICriteria criteria =

该场景是一个使用NHibernate与SQL Server数据库交互的MVC.NET应用程序

每个带有条件的NHibernate查询都可以正常工作,但我添加的最后一个查询除外,它会导致以下错误:

无法解析属性:Reading.Truck.Company.CompanyId of:ADO.Alarms

相关代码如下:

session = NHibernateSessionManager.Instance.GetSession();
            ICriteria criteria = session.CreateCriteria(typeof(Alarms));
            criteria.Add(Expression.Eq("Reading.Truck.Company.CompanyId", companyId));

            alarmsList = criteria.List<Alarms>();
这些属性在映射文件中定义如下:

Alarms.hbm.xml


...
...
所有其他条件查询,以及以相同方式定义的其他嵌套属性,都可以正常工作

奇怪的是,如果我使用createQuery方法的正常语法,所有的工作都很顺利;即:

session = NHibernateSessionManager.Instance.GetSession();
IQuery query = null;
query = session.CreateQuery("FROM Alarms al WHERE Reading.Truck.Company.CompanyId = (:companyId) ");
query.SetParameter("companyId", companyId);
alarmsList = query.List<Alarms>();
session=NHibernateSessionManager.Instance.GetSession();
IQuery=null;
query=session.CreateQuery(“来自报警al,其中Reading.Truck.Company.CompanyId=(:CompanyId)”;
SetParameter(“companyId”,companyId);
alarmsList=query.List,我知道有多种解决方法,但我正在寻找这种错误行为的原因

任何帮助都将不胜感激。 提前谢谢。

好的。 我已经了解了如何正确使用标准,阅读了NHibernate官方网站的答案,并遵循了这些标准

带条件的点表示法似乎仅适用于当前对象的组件(及其属性:即
Reading.ReadingId

如果我们想达到更深的属性,我们会使用

因此,此代码对于我的任务非常有效:

session = NHibernateSessionManager.Instance.GetSession();
ICriteria criteria = session.CreateCriteria(typeof(Alarms));
criteria.CreateCriteria("Reading").CreateCriteria("Truck")
        .Add(Expression.Eq("Company.CompanyId", companyId));

alarmsList = criteria.List<Alarms>();
session=NHibernateSessionManager.Instance.GetSession();
ICriteria criteria=session.CreateCriteria(报警类型));
criteria.CreateCriteria(“读取”).CreateCriteria(“卡车”)
.Add(Expression.Eq(“Company.CompanyId”,CompanyId));
alarmsList=criteria.List();

HQL(这是
CreateQuery
接受的内容)的解析方式与使用条件或QueryOver构建的查询不同。在本例中,HQL查询可能扩展为3或4个联接(请尝试分析它以查看)。为什么标准不支持这种查询?简单的回答是,它不是这样设计的。@Andrew谢谢,就是这样。我做了进一步的分析,找到了解决办法。
session = NHibernateSessionManager.Instance.GetSession();
IQuery query = null;
query = session.CreateQuery("FROM Alarms al WHERE Reading.Truck.Company.CompanyId = (:companyId) ");
query.SetParameter("companyId", companyId);
alarmsList = query.List<Alarms>();
session = NHibernateSessionManager.Instance.GetSession();
ICriteria criteria = session.CreateCriteria(typeof(Alarms));
criteria.CreateCriteria("Reading").CreateCriteria("Truck")
        .Add(Expression.Eq("Company.CompanyId", companyId));

alarmsList = criteria.List<Alarms>();