4

我在网上找到了一些资源,但还没有真正能够解决这个问题

基本上我有一个查询,上面有两个左外连接

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);

这可能是一种无效的方法,但它似乎没有中断。现在我想要做的是在两个表上留下了外连接,我想确保这两个表中的 Deleted 列都是错误的。

但是,每当我添加该限制时,结果仅在填充新闻帖子中的外键列时返回,但由于这是可以为空的以及为什么我将其设为左外部连接,所以这是不可取的。

基本上制作它的最佳方法是什么

.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();

这是你觉得不好的一种方式吗?如果是这样,你能解释一下为什么吗?我对优化sql知之甚少,因此我问...

于 2011-05-30T05:42:45.153 回答