8

この特定の sql クエリを nHibernate QueryOver 言語で記述しようとしていますが、これにはあまり詳しくありません。

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 オブジェクトを取得しようとしています - 常に 1 つまたは 1 つだけにする必要があります)。 . クエリは常に 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

結果を MessageThreadAccess に適合させようとするのではなく、DTO を使用して結果を保存しようとしてもよいと思います。

多分あなたは試すことができます:

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();

プロファイルは int[] ではなく Profile[] である場合、次の行:

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

する必要があります:

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

これが役立つことを願っています

于 2013-01-31T14:20:13.497 に答える