【问题标题】:Fetching Paginated Entity with Collection使用集合获取分页实体
【发布时间】:2014-06-21 22:27:06
【问题描述】:

考虑两个实体Person,它们有一个one-to-many集合Vehicles

public class Person
{
    public IList<Vehicle> Vehicles { get; set;}
}

public class Vehicle 
{
   public string Name { get; set;}

   public Person Owner { get; set; }
}

我显示一个有车辆的人的网格,并在网格中显示第一辆车的名称。网格是分页的。我使用以下标准来获取数据

我有一个为网格视图加载数据的标准

var criteria = DetachedCriteria.For<Person>()
    .CreateAlias("Vehicles","vehicle", JoinType.InnerJoin)
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .SetMaxResults(pageSize)
    .SetFirstResult((page - 1) * pageSize)

criteria.Add(Restrictions.Eq("vehicle.Name", "super"));

其中pagepageSize 是计算位。

问题是由于最大结果和第一个结果是在数据库中计算的,并且不同的根是在外部完成的,所以行数不匹配。

有没有办法解决这个问题?

【问题讨论】:

  • 执行一个查询/条件,首先检索行数,然后这个检索数据。

标签: c# nhibernate pagination nhibernate-criteria


【解决方案1】:

此类查询应始终使用subquery 而不是任何类型的JOIN。这也意味着,colleciton 项引用了父项(在我们的例子中)

所以,我们在这里为Vehicle 创建内部选择:

var vehicles = DetachedCriteria.For<Vehicle>();
// add any amount or kind of WHERE parts
vehicles.Add(Restrictions.Eq("vehicle.Name", "super"))
// and essential SELECT Person ID
vehicles.SetProjection( Projections.Property("Owner.ID"));

现在,我们可以调整上述查询,使其仅在根/父级别上工作:

var criteria = DetachedCriteria.For<Person>()

// instead of this
// .CreateAlias("Vehicles","vehicle", JoinType.InnerJoin)

// we will use subquery
.Add(Subqueries.PropertyIn("ID", vehicles));

// Wrong to use this approach at all
//.SetResultTransformer(new DistinctRootEntityResultTransformer())

.SetMaxResults(pageSize)
.SetFirstResult((page - 1) * pageSize)

这将像这样创建 SELECT:

SELECT p....
FROM Person AS p
WHERE p.ID IN (
  SELECT v.OwnerId
  FROM Vehcile AS v
    WHERE v.Name = 'super' ...
)

另见:

以及如何获取Vehicles的集合(直到现在只用于过滤)?最好的(如果不是唯一的) 方法是使用 1+1 SELECT 语句。简单的内置解决方案是batch-size 设置。只需使用此设置标记Vehicles 的集合(例如batch-size="25"),然后再添加一些 SELECT 语句,所有数据都将被有效加载。见:

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多