4

オンラインでいくつかのリソースを見つけましたが、実際にはこれを整理することができませんでした

基本的に、2つの左外部結合を持つクエリがあります

var query = session.QueryOver<NewsPost>(() => newsPostAlias)
                    .Left.JoinQueryOver(x => newsPostAlias.PostedBy, () => userAlias)
                    .Left.JoinQueryOver(x => newsPostAlias.Category, () => categoryAlias)
                        .Fetch(x => x.PostedBy).Eager
                        .Fetch(x => x.Category).Eager
                    .Where(x => !x.Deleted);

これは無効な方法かもしれませんが、壊れていないようです。ここで、外部結合を残した2つのテーブルで、これらの両方のテーブルのDeleted列がfalseであることを確認します。

ただし、その制限を追加すると、ニュース投稿の外部キー列にデータが入力された場合にのみ結果が返されますが、これはnull可能であり、なぜそれを左外部結合にしたのかは望ましくありません。

基本的にそれを作るための最良の方法は何ですか

.Where(x => !x.Deleted && !x.PostedBy.Deleted && !x.Category.Deleted);

私は複数の質問、先物、論理和を調べましたが、どのアプローチを取るべきかわかりません。明らかに、これを行うためのいくつかの方法(私の腸が私に言う悪い方法)を考えることができますが、正しい方法は何ですか?:)

ありがとう

編集-承認された回答の変更

return session.QueryOver(() => newsPostAlias)
                    .Fetch(x => x.PostedBy).Eager
                    .Fetch(x => x.Category).Eager
                .Left.JoinQueryOver(() => newsPostAlias.PostedBy, () => postedByAlias)
                .Left.JoinQueryOver(() => newsPostAlias.Category, () => categoryAlias)
                .Where(() => !newsPostAlias.Deleted)
                .And(() => newsPostAlias.PostedBy == null ||  !postedByAlias.Deleted)
                .And(() => newsPostAlias.Category == null ||  !categoryAlias.Deleted)
                .OrderBy(() => newsPostAlias.PostedDate).Desc
                .Take(10)
                .List();
4

2 に答える 2

7

クエリは次のようになります。

        Session.QueryOver<NewsPost>()
            .Left.JoinAlias(x => x.PostedBy, () => userAlias)
            .Left.JoinAlias(x => x.Category, () => categoryAlias)
            .Where(x => !x.Deleted)
            .And(x => !userAlias.Deleted)
            .And(x => !categoryAlias.Deleted);
于 2011-05-30T12:43:09.460 に答える
0

これはうまくいくようです...

var posts = session.QueryOver<NewsPost>()
    .Left.JoinAlias(x => x.Category, () => category)
    .Left.JoinAlias(x => x.PostedBy, () => user)
    .Where(x => x.Deleted == false)
    .Where(Restrictions
        .Or(
                Restrictions.Where(() => user.Deleted == false), 
                Restrictions.Where<NewsPost>(x => x.PostedBy == null)
        )
    )
    .Where(Restrictions
        .Or(
                Restrictions.Where(() => category.Deleted == false), 
                Restrictions.Where<NewsPost>(x => x.Category == null)
        )
    )
    .List();

これはあなたが悪いと感じた方法の1つでしたか?もしそうなら、その理由を説明していただけますか?私はSQLの最適化について十分に知らないので、質問しています...

于 2011-05-30T05:42:45.153 に答える