NHibernate中子对象的排序
我有一个加载产品集合的方法。每个订单都有一个名为Manufacturer的子对象(我在映射文件中设置了多对一关系)。我想按Products.Manufacturer.Name对产品集合进行排序。我该怎么做 产品映射:NHibernate中子对象的排序,nhibernate,Nhibernate,我有一个加载产品集合的方法。每个订单都有一个名为Manufacturer的子对象(我在映射文件中设置了多对一关系)。我想按Products.Manufacturer.Name对产品集合进行排序。我该怎么做 产品映射: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Model.Catalog.Pr
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.Catalog.Product,Model" table="Catalog.Product">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" column="Name" type="string" length="50" not-null="true" />
<property name="Description" column="Description" type="String" not-null="false" />
<property name="CreatedByUserId" column="CreatedByUserId" type="Guid" not-null="true" />
<many-to-one name="Manufacturer" column="ManufacturerID" not-null="true" class="Catalog.Manufacturer,Model" />
</class>
</hibernate-mapping>
制造商映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.Catalog.Manufacturer,Model" table="Catalog.Manufacturer">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" column="Name" type="string" length="50" not-null="true" />
</class>
</hibernate-mapping>
呼叫代码:
public IList<Model.Catalog.Product> GetProducts(int startIndex, int rowCount, string sort, string productNameFilter, int? manufacturerIDFilter)
{
IList<Model.Catalog.Product> result = null;
using (ITransaction transaction = this.Session.BeginTransaction())
{
ICriteria query = this.Session.CreateCriteria<Model.Catalog.Product>();
//Add paging...
query.SetFirstResult(startIndex).SetMaxResults(rowCount);
//Add filters...
if (productNameFilter != null)
{
query.Add(Expression.Like("Name", productNameFilter, MatchMode.Anywhere));
}
if (manufacturerIDFilter.HasValue == true)
{
//This works when using Manufacturer.ID...
query.Add(Expression.Eq("Manufacturer.ID", manufacturerIDFilter.Value));
}
//Add sort...
switch (sort)
{
case "ProductName ASC":
query.AddOrder(new Order("Name", true));
break;
case "ManufacturerName ASC":
//This doesn't work when using Manufacturer.Name, but does when using Manufacturer.ID...
query.AddOrder(new Order("Manufacturer.Name", true));
break;
case "ProductName DESC":
query.AddOrder(new Order("Name", false));
break;
case "ManufacturerName DESC":
query.AddOrder(new Order("Manufacturer.Name", false));
break;
}
result = query.List<Model.Catalog.Product>();
transaction.Commit();
}
return result;
}
公共IList GetProducts(int startIndex、int rowCount、字符串排序、string productNameFilter、int?manufacturerIDFilter)
{
IList result=null;
使用(ITransaction transaction=this.Session.BeginTransaction())
{
ICriteria query=this.Session.CreateCriteria();
//添加分页。。。
query.SetFirstResult(startIndex).SetMaxResults(rowCount);
//添加过滤器。。。
如果(productNameFilter!=null)
{
添加(Expression.Like(“Name”、productNameFilter、MatchMode.Anywhere));
}
if(manufacturerIDFilter.HasValue==true)
{
//这在使用制造商ID时有效。。。
Add(Expression.Eq(“Manufacturer.ID”,manufacturerIDFilter.Value));
}
//添加排序。。。
开关(分拣)
{
案例“ProductName ASC”:
query.AddOrder(新订单(“名称”,true));
打破
案例“制造商名称ASC”:
//这在使用Manufacturer.Name时不起作用,但在使用Manufacturer.ID时起作用。。。
query.AddOrder(新订单(“Manufacturer.Name”,true));
打破
案例“ProductName DESC”:
query.AddOrder(新订单(“名称”,false));
打破
案例“制造商名称说明”:
query.AddOrder(新订单(“制造商名称”,false));
打破
}
结果=query.List();
Commit();
}
返回结果;
}
我认为您需要使用类似于以下内容的方法
IList<Order> orders = Session.CreateCriteria(typeof(Order))
.AddOrder(Order.Asc("Order.Customer.LastName")
.List<Order>();
IList orders=Session.CreateCriteria(typeof(Order))
.AddOrder(Order.Asc(“Order.Customer.LastName”)
.List();
太好了!我还是个傻瓜,没有意识到你可以这么做。非常感谢!对不起,我可能说得太早了。我可以在我的子对象中使用某些字段,但不是所有字段。你可以使用ManufacturerID进行排序的原因是因为它是产品表上的外键。如果你查看SQL,就没有jo了在toCatalog.Manufacturer
中,您需要在'query.AddOrder(新订单(“Manufacturer.Name”,true))之前添加另一个query.CreateCriteria(“Manufacturer”)
这是为了让nhibernate知道将制造商表作为查询的一部分。就是这样!非常感谢您的解释。我刚刚开始学习nhibernate,每天都学习一些新的东西。