2

次のエンティティがあります:

class Topic
{
    public virtual int Id {get; private set;} 
    public virtual ICollection<Vote> Votes {get; private set; }
}

class Vote
{
    public virtual Topic Topic {get; private set;}
    public virtual VoteType VotedTo {get; private set;} // enum VotedUp, VotedDown
}

データベースから次の情報をロードする必要があります - すべてのトピック (ID、実際には名前ですが、このデモの場合は問題ではありません) と、さらに 2 つのフィールドCountOfVotedUp、CountOfVotedDown (集計)です。したがって、SQL の世界では、結合、グループ化、ケース、およびカウントが必要であると理解しています。

db での操作が少ない LINQ でこの情報を取得することは可能ですか? N+1、追加の選択、接続などを意味します。

私が試したのは、NHのLINQを使用することだけですが、Topic.Idでのみクエリ集計を行い、投票コレクションをカウントできませんでした。

4

1 に答える 1

3

結果を保存するための要約クラスがある場合:

public class  SummaryDTO
{
    public int TopicId { get; set; }
    public VoteType TypeOfVote { get; set; }
    public int VoteCount { get; set; }
}

それから

Vote voteAlias = null;
SummaryDTO result = null;

youNHSession.QueryOver<Topic>()
  .JoinAlias(x=> x.Votes, ()=>voteAlias)
  .SelectList(
    list=>list
      .SelectGroup(topic=>topic.Id).WithAlias(()=>result.TopicId)            
      .SelectGroup(()=>voteAlias.VotedTo).WithAlias(()=>result.TypeOfVote)
      .SelectCount(()=>voteAlias.VotedTo).WithAlias(()=>result.VoteCount ))
  .TransformUsing(Transformers.AliasToBean<SummaryDTO>())
  .List<SummaryDTO>();

それはまさにあなたが探しているものではないと思いますが、これがあなたを良い軌道に乗せることを願っています.

于 2012-05-02T12:54:59.977 に答える