8

我正在尝试用我不太熟悉的 nHibernate QueryOver 语言编写这个特定的 sql 查询:

SELECT MessageThreadId FROM MessageThreadAccesses
WHERE ProfileId IN (arr)
GROUP BY MessageThreadId
HAVING COUNT(MessageThreadId) = arr.Count

其中 arr 是我作为参数传递的整数数组(用户 ID),MessageThreadAccess 实体如下所示:

public virtual MessageThread MessageThread { get; set; }
public virtual Profile Profile { get; set; }
....

在阅读了多个堆栈溢出线程并进行了实验之后,我的查询已经走到了这一步(尝试获取 MessageThread 对象 - 它应该始终只有一个或没有),但它仍然不起作用,我不确定还有什么可以尝试. 查询似乎总是返回 MessageThreadAccess 对象,但在读取它的 MessageThread 属性时,它始终为 NULL。

var access = Session.QueryOver<MessageThreadAccess>()
    .WhereRestrictionOn(x => x.Profile).IsIn(participants.ToArray())
    .Select(Projections.ProjectionList()
        .Add(Projections.Group<MessageThreadAccess>(x => x.MessageThread))
    )
    .Where(
        Restrictions.Eq(Projections.Count<MessageThreadAccess>(x => x.MessageThread.Id), participants.Count)
    )
    .TransformUsing(Transformers.AliasToBean<MessageThreadAccess>())
    .SingleOrDefault();

return Session.QueryOver<MessageThread>()
    .Where(x => x.Id == access.MessageThread.Id)
    .SingleOrDefault();

有人可以指出我正确的方向,或者解释我做错了什么吗?

提前致谢。

4

1 回答 1

4

我想您可以尝试使用 DTO 来存储结果,而不是尝试将结果放入 MessageThreadAccess 中,当它不是一个(没有配置文件)时。

也许你可以试试:

public class MessageThreadCountDTO
{
    public MessageThread Thread { get; set; }
    public int Nb { get; set; }
}

然后

var profiles = new int[] { 1,2,3,4 };

MessageThreadCountDTO mtcDto = null;

var myResult = 
  _laSession.QueryOver<MessageThreadAccess>()
     .WhereRestrictionOn(x => x.Profile.Id).IsIn(profiles)
     .SelectList(list =>
         list.SelectGroup(x => x.MessageThread).WithAlias(() => mtcDto.Thread).
         SelectCount(x => x.MessageThread).WithAlias(() => mtcDto.Nb)
         )
     .Where(Restrictions.Eq(Projections.Count<MessageThreadAccess>(x => x.MessageThread), profiles.Count()))
     .TransformUsing(Transformers.AliasToBean<MessageThreadCountDTO>())
     .List<MessageThreadCountDTO>().FirstOrDefault();

profile 将是 Profile[],而不是 int[],然后是以下行:

.WhereRestrictionOn(x => x.Profile.Id).IsIn(profiles)

应该 :

.WhereRestrictionOn(x => x.Profile).IsIn(profiles)

希望这会有所帮助

于 2013-01-31T14:20:13.497 回答