2012-04-20 6 views
1

申し訳ありません私はNHibernateの初心者です。私はこの質問に自分自身を困らせないことを願っています。NHibernateの関連するテーブルから別の値のセットを選択

私はLogsとUserProfilesテーブルにそれぞれ2つのオブジェクト、LogとUserProfileを持っています。各Logオブジェクトは、1つまたはすべてのUserProfileオブジェクトを参照します。

UserProfile.UserName文字列の明確なリストをログ表から効率的に収集するには、アルファベット順に並べ替えが必要です。 Linqではこれはかなり簡単ですが、これをデータベース側で行いたいと思います。何が私のだろう

public IEnumerable<string> GetUserNamesInLogs(){} 

のようなもの?私はNHibernateので同等のを探しています

select distinct 
    u.UserName 
from 
    Logs as l 
inner join 
    UserProfiles as u 
    on u.UserId = l.UserId; 

:私はSQLでこれを書いていた場合

、私はこのような何かをするだろう。私はこれに怠け者のロードを望んでいないと思う(それはパフォーマンスの低下のようだ)が、私は遅延ロードがどのように働くかについてはっきりしないかもしれない。

+0

ログを読み込み、各ログごとに個別のユーザー名のコレクションを読み込みたい場合や、すべてのユーザー名が異なるクエリを欲しいとしますか?この質問は十分にはっきりしていません – Rippo

+0

私のログエントリに表示されるユーザー名の明確なリストが必要です。私はそれが怠惰になることを望まないと思うだろうが、私は間違っている可能性がある。私は私の質問の文脈を追加します。 –

答えて

0

全く私が基準とすることを望んでいたように動作するようにdurnものを得るために失敗し、私はだまさ:

var result = _Session.CreateQuery("select distinct profile.UserName from Log as l inner join l.UserProfile as profile order by profile.UserName asc") 
    .List<string>(); 

これは私が探していた結果を与えました。しかし助けてくれた人々に感謝します。

1

クラスとマッピングなしでは答えにくいです。 あなたはのUserProfileクラスでのUserProfileのログに対応するログコレクションプロパティをマッピングされたと仮定すると、のUserProfileのためのあなたのクラスとのマッピングは次のようになります。

public class UserProfile 
{ 
... 

public virtual IList<Log> Logs {get;set;} 

... 
} 


<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" > 
    <class name="blabla.UserProfile, blabla" table="UserProfiles"> 

    ..... 
    <bag name="Logs" fetch="select" inverse="true" access="property" lazy="true"> 
    <key column="UserId"/> 
    <one-to-many class="blabla.Log, blabla"/> 
    </bag> 

............ 

、あなたはこのような何かを試すことができます​​

+0

ええと...実際に私は 'UserProfile'クラスを私のLogクラスにマッピングしました。違いがありますか?そして、うわー、それは複雑に見えます。 –

+0

@JeremyHolovacs:自分の投稿を編集しました。投影を上書きする/投影を上書きする/投影を並べ替えると、それはすぐに複雑になります;-)もっと単純な解決策があるかもしれません。 – jbl

+0

私は今夜これを試してみます。 –

2

JBLの答えのためのいくつかの最適化:

UserProfile userProfileAlias = null; 
Log logAlias = null; 

session.QueryOver(() => userProfileAlias) 
       .JoinAlias(() => userProfileAlias.Logs,() => logAlias) 
       .Select(
        Projections.Distinct(Projections.Property(() => userProfileAlias.Name)))) 
       .OrderBy(() => userProfileAlias.Name).Asc 
       .List<string>(); 
関連する問題