2

次のようにLinqからNHibernateへのクエリがあります。

var profile = 
    from UserProfile up in _Session.Query<UserProfile>()
        .Fetch(x=>x.Messages)
    where up.UserName == userName
    select up.Messages;

IQueryable<IList<UserMessage>>これは、を実行する必要があるを返しますSelectMany()IQueryable<UserMessage>特にクエリが複数のユーザープロファイルを返すことは決してないので、代わりにオブジェクトを返すことができればと思います。これを行うことはできますか、それとも私は余分なステップで立ち往生していますか?

4

2 に答える 2

1

ナビゲーションの反対側をマップする場合、たとえばクラスにUserProfileプロパティがある場合は、次の場所から開始できます。UserMessageUserMessage

var messages = 
    from UserMessage um in _Session.Query<UserMessage>()
    where um.UserProfile.UserName == userName
    select um;

SelectMany()それ以外の場合は、フラット化されたリストを取得するために使用する必要があります。

于 2012-09-01T15:18:12.657 に答える
1

メッセージテーブルを直接クエリして、逆の関連付けを使用できますか?

IQueryable<Message> messages = ...;
var filtered = from m in messages
    where m.UserProfile.UserName == userName
    select m;

また、クエリ構文を放棄する場合は、次の方法でこれを短くすることができます。

var profile = _Session.Query<UserProfile>()
    .Where(up => up.UserName == userName)
    .SelectMany(up => up.Messages);
于 2012-09-01T15:22:36.230 に答える