6

私はNHibernateクックブックと利用可能なすべてのフォーラム投稿を上下に読んでいましたが、この単純なクエリを実行することはまだできません:

全員が 1 つのアカウントを持つユーザーがいます。各口座には残高があります。クラスは次のようになります。

public class User
{
    public virtual int Id { get; set; }
    public virtual Account Account { get; set; }
    public virtual bool Active { get; set; }
}

public class Account
{
    public virtual int Id { get; set; }
    public virtual double Balance { get; set; }
}

ここで、すべてのアクティブ ユーザーの残高を合計したいと思います。それ以上はありません...プレーンSQLでは非常に簡単です:

SELECT SUM(a.Balance)
FROM User u
INNER JOIN Account a
ON u.Account_id = a.Id
WHERE u.Active = 'true'

NHibernate 3 の新しい QueryOver-Api を使用してどのように解決できるかわかりません。コード例を教えてください。

前もって感謝します!

ダニエル・ラング


EDIT
NHibernate Linqでも非常に簡単ですが、QueryOverを使用して解決したいと思います...これが実際のLinq-Exampleです。

var result = Session.Query<User>()
                        .Where(x => x.Active)
                        .Sum(x => x.Account.Balance)


ソリューション
AlexCuse のおかげで、私は最終的な解決策を見つけることができました (彼は非常に近いものでした) - 完全なコードは次のとおりです。

User userAlias = null;
Account accountAlias = null;

session.QueryOver<User>(() => userAlias)
    .JoinAlias(() => userAlias.Account, () => accountAlias)
    .Where(() => userAlias.Active)
    .Select(Projections.Sum<Account>(acct => accountAlias.Balance))
    .SingleOrDefault<double>()
4

2 に答える 2

9

このようなことを試しましたか?

session.QueryOver<User>(() => userAlias)
    .JoinAlias(() => userAlias.Account, () => accountAlias)
    .Where(() => userAlias.Active)
    .Select(Projections.Sum<Account>(acct => acct.Balance))
    .UnderlyingCriteria.UniqueResult()

UniqueResult に相当するものが QueryOver API にあるかわからないため、基になる基準を確認する必要がありました。

于 2011-06-16T16:39:34.273 に答える
0

あなたはあなたの答えに書いた:

User userAlias = null;
Account accountAlias = null;

session.QueryOver<User>(() => userAlias)
    .JoinAlias(() => userAlias.Account, () => accountAlias)
    .Where(() => userAlias.Active)
    .Select(Projections.Sum<Account>(acct => accountAlias.Balance))
    .SingleOrDefault<double>()

ジェネリック型のエイリアスは必要ありません。かもしれない:

Account accountAlias = null;

session.QueryOver<User>()
    .JoinAlias(user => user.Account, () => accountAlias)
    .Where(user => user.Active)
    .Select(Projections.Sum<Account>(acct => accountAlias.Balance))
    .SingleOrDefault<double>() 
于 2018-04-27T09:31:11.430 に答える