【问题标题】:Fluent NHibernate not return distinct valuesFluent NHibernate 不返回不同的值
【发布时间】:2014-01-11 09:30:04
【问题描述】:

我有代码通过名为 GroupToUsers 的表调用与用户具有一对多关系的组列表。

我正在尝试列出包含每个组内用户列表的不同组列表。

我是 NHibernate 的新手,所以请耐心等待 :)。

代码:

IQueryOver<Group, Group> query = this.Session.QueryOver<Group>()
    .Where(g => g.IsActive && !g.IsDeleted)
    .Fetch(g => g.Users).Eager
    .JoinAlias(g => g.Users, () => groupToUser, JoinType.LeftOuterJoin)
    .Where(g => g.Owner.Id == userId || (groupToUser.Group != null && groupToUser.IsAccepted && groupToUser.Profile.Id == userId))
    .OrderBy(g => g.Description).Asc
    .TransformUsing(Transformers.DistinctRootEntity);
        IQueryOver<Group> countQuery = query.ToRowCountQuery().Cacheable();
        IFutureValue<int> totalCount = countQuery.FutureValue<int>();

        result.Items = query.Take(size + 1).Skip((page - 1) * size).List();
        result.Count = totalCount.Value;

我期待 9 条记录,但它返回的计数为 11(有 11 行 2 组重复两次,因为它们每组有 2 个用户)

所以我的问题是为什么 result.Count 返回 11 而不是 9?

【问题讨论】:

  • 如果您是 NHibernate 的新手,使用 queryover 而不是 linq-to-nhibernate 是经过深思熟虑的选择吗?由于 lambda 的使用,许多新手继续使用 QueryOver 认为它是 NHibernate“linq”,但不,它是别的东西。

标签: c# nhibernate fluent-nhibernate


【解决方案1】:

您说得对,说计数随着Users 集合中的每个用户记录而扩展。这是.Fetch() 调用的结果。

有两个查询。第一个(原始的转换),第二个,只是一个调用来获取count。问题是,第二个查询没有调用

.TransformUsing(Transformers.DistinctRootEntity); 

(和第一个一样)。它只是上一个查询的克隆(没有排序依据),这就是它返回真正的 11 的原因。

一般。我建议,不要在映射的集合上使用获取。这有这些副作用......例如不可预知的分页Take()Skip() 将应用于 DB 端,而 Distinct 根应用于客户端/应用服务器)

我更喜欢什么方式,并且使用时间长,是使用批量获取。这意味着,像这里描述的那样更改映射:19.1.5. Using batch fetching

使用 Fluent 映射,您必须像这样更新您的用户映射

HasMany(x => x.Users)
  ...
  .BatchSize(25);

并且将执行至少两个查询(可能是 3 个)...一个针对根实体,一个针对集合项(用户).. 但不是针对每个根元素,而是作为一个批处理。所以,不是一次性完成,但仍然非常高效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多