4

単純かもしれませんが、私はそれに固執しており、それをどのように行うことができるかについての答えが見つかりませんでした. 子エンティティ Operations のコレクションを持つ親エンティティ User があります。これら 2 つのエンティティは UI 用であるため、一種のビューです。ここに疑似コードがあります

public class User
{
   public int Id {get; set;}
   public IEnumerable<Operation> Operations {get; set;}
   public int TotalSuccessfulAccesses {get; set;} // not mapped to the database
   public int TotalFailedAccesses {get; set;}     // not mapped to the database
}

public class Operation
{
   public int Id {get; set; }
   public int UserId {get; set; } // FK
   public int NbSuccessfulAccesses {get; set; }
   public int NbFailedAccesses {get; set; }
}

私がやりたいのは、TotalSuccesfulAccesses と TotalFailedAccesses を持つユーザーを、データベースへの 1 回の往復で子コレクションから初期化することです。

各ユーザーについてSum(Operation.NbSuccessfulAccesses)Sum(Operation.NbFailedAccesse ) を計算し、それぞれUser.TotalSuccesfulAccessesUser.TotalFailedAccessesに射影する必要があります。

多基準といくつかのクエリを試してみましたが、満足できません。投影などで簡単な方法があるかどうか知りたいです。または多分私は何かを逃した。

あなたは何をお勧めします ?

よろしくお願いします。

4

3 に答える 3

4

次の方法で、魔法のエイリアス文字列を取り除くことができました。

UserViewModel userView = null;

Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses).WithAlias(() => userView.TotalSuccessfulAccesses))
于 2011-05-04T14:55:55.603 に答える
3

おそらく、ビューモデルとドメインエンティティを分離する必要があります。あなたのドメインには、操作のリストを持つUserクラスがあり、これらのエンティティはそれに応じてマップされていると思います。

次に、ビューモデルを作成できます。

public class UserViewModel
{
    public int UserId { get; set; }
    public int TotalSuccessfulAccesses { get; set; }
    public int TotalFailedAccesses {get; set;}
}

ICriteriaを使用すると、次のクエリを作成できます。

var criteria = Session.CreateCriteria(typeof(User));
criteria.CreateAlias("Operations", "operations", JoinType.LeftOuterJoin);

var projList = Projections.ProjectionList();

projList.Add(Projections.GroupProperty("Id"));
projList.Add(Projections.Sum("operations.NbSuccessfulAccesses"), "TotalSuccessfulAccesses"); 
projList.Add(Projections.Sum("operations.NbFailedAccesses"), "TotalFailedAccesses");

criteria.SetProjection(projList);
criteria.SetResultTransformer(Transformers.AliasToBean<UserViewModel>());

var ret = criteria.List<UserViewModel>();

必要に応じてビューモデルを作成し、それに応じてプロジェクションリストにプロパティを追加します。

お役に立てば幸いです。

于 2011-04-27T09:29:03.227 に答える
2

ケイのおかげで、私は次の翻訳を思いついた:

Operation operations = null;
var q = GetSession().QueryOver<User>().Where(u => u.AccessKeyId == accessKeyId)
                    .Left.JoinQueryOver(x => x.Operations, () => operations)
                    .Select(Projections.ProjectionList()
                        .Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses), "TotalSuccessfulAccesses"))
                        .Add(Projections.Sum<User>(x => operations.NbFailedAccesses), "TotalFailedAccesses"))
                    .TransformUsing(Transformers.AliasToBean<UserViewModel>()).List< UserViewModel >();

しかし、マジックストリング「TotalSuccessfulAccesses」と「TotalFailedAccesses」を取り除く手段があるかどうか知りたいです。

私がそのようなものを使うなら

UserViewModel userView = null;

Add(Projections.Sum<User>(x => operations.NbSuccessfulAccesses),  () => userView.TotalSuccessfulAccesses)

NHibernateはエラーを生成します:

クラス'Domain.Query.UserViewModel'でプロパティ'userView.TotalSuccessfulAccesses'のセッターが見つかりませんでした

TotalSuccessfulAccessesのプロパティにセッターがあるため、これは正しくありません。

何か案は ?

ありがとう

于 2011-04-27T10:48:39.117 に答える