我在理解一些代码时遇到了一些麻烦。我有2个公司和公司位置。映射为:
<?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>
我正在尝试使用Criteria查询进行查询,如下所示:
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>();
}
当我调用该方法并传入sortExpression“Company.CompanyName DESC”时,Sort类将解析它,以便: AssociationPath =“公司” SortColumn =“CompanyName” IsAscending = false
未注释掉的方法中的if块有效。如果我更改为注释掉的那个,它将失败: 无法解析属性:CompanyName
我无法理解原因。
答案 0 :(得分: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));