【问题标题】:NHibernate QueryOver with WhereRestriction as ORNHibernate QueryOver 与 WhereRestriction 作为 OR
【发布时间】:2014-07-07 10:10:39
【问题描述】:

我有这个查询,但我似乎找不到如何将 WhereRestrictionOn 设置为 OR。现在它们起到 AND 的作用,但我想要一个 OR 另一个。

var privateInfo = Session.QueryOver<ConContact>()
            .JoinAlias(c => c.PrivateInfos, () => pi)
            .WhereRestrictionOn(c => c.FirstName).IsLike(_selectedFirstLetter + "%")
            .WhereRestrictionOn(c => c.LastName).IsLike(_selectedFirstLetter + "%") // todo: change to firstname OR lastname
            .Where(c => c.Status == ContactStatus.Approved)
            .Select(
                Projections.Property("pi.Id").WithAlias(() => sri.Id),
                Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo
                Projections.Property("pi.Address").WithAlias(() => sri.Address),
                Projections.Constant("Contact").WithAlias(() => sri.Type)
            )
            .TransformUsing(Transformers.AliasToBean<SearchResultInfo>())
            .List<SearchResultInfo>()
            .ToList();

非常感谢任何帮助!

解决方案:

var privateInfo = Session.QueryOver<ConContact>()
            .JoinAlias(c => c.PrivateInfos, () => pi)
            .Where(
                Restrictions.Disjunction()
                    .Add(Restrictions.Like("FirstName", _selectedFirstLetter + "%"))
                    .Add(Restrictions.Like("LastName", _selectedFirstLetter + "%"))
            )
            .Where(c => c.Status == ContactStatus.Approved)
            .Select(
                Projections.Property("pi.Id").WithAlias(() => sri.Id),
                Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo
                Projections.Property("pi.Address").WithAlias(() => sri.Address),
                Projections.Constant(NewObjectType.Contact).WithAlias(() => sri.Type)
            )
            .TransformUsing(Transformers.AliasToBean<SearchResultInfo>())
            .List<SearchResultInfo>()
            .ToList();

【问题讨论】:

    标签: asp.net-mvc nhibernate queryover


    【解决方案1】:

    顶级.Where()family(包括WhereRestrictionOn总是与AND连接。所以我们必须明确地使用类似的东西:

    • Restrictions.Or(restriction1, restriction1)
    • Restrictions.Disjunction().Add(restriction1).Add(restriction2).Add(...

    所以,这可能是我们的情况:

    .Where(
        Restrictions.Disjunction()
            .Add(Restrictions.On<ConContact>(c => c.FirstName)
                                  .IsLike(_selectedFirstLetter, MatchMode.Start))
            .Add(Restrictions.On<ConContact>(c => c.LastName)
                                  .IsLike(_selectedFirstLetter, MatchMode.Start))
            // more OR ...
            //.Add(Restrictions.On<ConContact>(c => c.MiddleName)
            //                      .IsLike(_selectedFirstLetter, MatchMode.Start))
    )
    

    正如这里所讨论的:16.2. Simple Expressions,对于简单的东西我们甚至可以use ||(引用的小例子)

    .Where(p => p.Name == "test name" && (p.Age > 21 || p.HasCar))
    

    【讨论】:

    • 谢谢!这对我有用,解决方案发布在主题中。
    • 很高兴看到这一点!享受 NHiberante ;) ...也许,尝试按照我的建议重新考虑 MatchMode 的使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多