无法解析属性(复杂属性)

问题描述:

我有一个与NHibernate的asp.net mvc应用程序,我不知道如何解决一个问题来查询一些数据。我有这个疑问:无法解析属性(复杂属性)

// create query 
var query = session.QueryOVer<Laudo>().Fetch(x => x.Equipament).Eager; 

// add some filters 
if (idEquipament.HasValue) 
    query = query.And(x => x.Equipament.Id == idEquipament.Value); 

//I got the error here... 
if (idCompany.HasValue) 
    query = query.And(x => x.Equipament.Company.Id == idCompany.Value); 

当我尝试执行此查询,我已经得到了这个消息的异常: “无法解析属性:的Equipament.Company.Id:DomainModel.Laudo

我能做些什么来解决这个问题? 谢谢

你不能使用这样的另一个实体属性。 NHibernate期望表达式可以被评估为当前实体的属性。您需要使用JoinQueryOverJoinAlias加入另一个实体,然后执行where

随着JoinQueryOver

// ... 
query = query.JoinQueryOver(x => x.Equipment) 
    .JoinQueryOver(x => x.Company) 
    .Where(c => c.Id == idCompany.Value); 

随着JoinAlias

Equipment equipment = null; 
Company company = null; 

// ... 
query = query.JoinAlias(x => x.Equipment,() => equipment) 
    .JoinAlias(() => equipment.Company,() => company) 
    .Where(() => company.Id == idCompany.Value); 

一些更多的信息:
What is the difference between JoinQueryOver and JoinAlias?
What can be used as a NHibernate QueryOver alias?
Complex nHibernate QueryOver expression

+0

感谢:

这是通过使用扩展方法Query,在NHibernate.Linq命名空间中实现的。我使用JoinAlias解决它。 – 2012-07-08 21:54:21

+0

只是一个问题,有没有什么方法可以只填写这个连接的一些属性,我的意思是......公司实体有20多个字段,而我只需要2个(Id和Name),有没有办法做到这一点?谢谢 – 2012-07-08 22:29:22

+0

预测? http://www.nhforge.org/doc/nh/en/index.html#queryqueryover-projections – 2012-07-08 22:33:39

为你的问题选择的标签让我觉得你不想使用QueryOver,但是LINQ。对于awser人

var query = session.Query<Laudo>().Fetch(x => x.Equipament); 
if (idEquipament.HasValue) 
    query = query.Where(x => x.Equipament.Id == idEquipament.Value); 
if (idCompany.HasValue) 
    query = query.Where(x => x.Equipament.Company.Id == idCompany.Value); 
+0

嗨@Diego,不错的提示,但我用AND()方法,因为它genarates上的AND操作符之间的SQL语句参数(我有我的原始方法更多的参数)像'idEquipament =? AND Equipament.Company_Id =?'...并像你说的那样使用,有没有什么优势,或者它会一样?谢谢! – 2012-07-09 02:37:47

+0

完全一样。 – 2012-07-09 10:44:55