2009-06-26 72 views
0

我在理解一些代码时遇到了一些麻烦。我有2类公司和公司位置。映射为:NHibernate Criteria查询楼

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Core.DataTransfer.CompanyLocation,Core.DataTransfer" table="`CompanyLocation`" lazy="true"> 
    <id name="CompanyLocationId" column="`CompanyLocationID`" type="int"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Company" cascade="none" column="`CompanyID`" not-null="true" /> 
    </class> 
</hibernate-mapping> 

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Core.DataTransfer.Company,Core.DataTransfer" table="`Company`" lazy="true"> 
    <id name="CompanyId" column="`CompanyID`" type="int"> 
     <generator class="native" /> 
    </id> 
    <property type="string" not-null="true" length="100" name="CompanyName" column="`CompanyName`" /> 
    <bag name="CompanyLocations" inverse="true" lazy="true" cascade="all"> 
     <key column="`CompanyID`" /> 
     <one-to-many class="Core.DataTransfer.CompanyLocation,Core.DataTransfer" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

我试图用一个标准查询,如下查询:

 public IList<CompanyLocation> GetCompanyLocations(string sortExpression) 
     { 
      ICriteria criteria = _session.CreateCriteria(typeof(CompanyLocation)); 

      if (!string.IsNullOrEmpty(sortExpression)) 
      { 
       Sort sort = new Sort(sortExpression); 
       if (!string.IsNullOrEmpty(sort.AssociationPath)) 
       { 
        criteria.CreateCriteria(sort.AssociationPath).AddOrder(new Order(sort.SortColumn, sort.IsAscending)); 
       } 
//    if (!string.IsNullOrEmpty(sort.AssociationPath)) 
//    { 
//     criteria.CreateCriteria(sort.AssociationPath); 
//    } 
//    criteria.AddOrder(new Order(sort.SortColumn, sort.IsAscending)); 
      } 
      return criteria.List<CompanyLocation>(); 
     } 

当我调用该方法,并传递“Company.CompanyName DESC”排序类的的SortExpression将解析它,以便: AssociationPath =“公司” SortColumn =“公司名称” IsAscending =假

IF块在没有被注释掉工程的方法。如果我更改为被注释掉失败与一个: 无法解析属性:公司

我无法理解为什么。

回答

3

原因很可能是个createCriteria()创建一个新的标准(而不是修改为你的代码期望原始)

尝试更改为

if (!string.IsNullOrEmpty(sort.AssociationPath)) 
{ 
    var criteriaCopy = criteria.CreateCriteria(sort.AssociationPath); 
} 
criteriaCopy.AddOrder(new Order(sort.SortColumn, sort.IsAscending)); 

或只是简单的

if (!string.IsNullOrEmpty(sort.AssociationPath)) 
{ 
    criteria = criteria.CreateCriteria(sort.AssociationPath); 
} 
criteria.AddOrder(new Order(sort.SortColumn, sort.IsAscending));