asp.net-mvc - NHibernate QueryOver 与WhereRestriction 为 OR

标签 asp.net-mvc nhibernate queryover

我有这个查询,但我似乎找不到如何将WhereRestrictionOn设置为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();

最佳答案

顶级 .Where() 系列(包括 WhereRestrictionOn) 始终使用 AND 连接。所以我们必须明确使用类似的东西:

  • 限制.Or(限制1, 限制1)
  • 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 ,对于简单的东西,我们甚至可以使用||(引用小例子):

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

关于asp.net-mvc - NHibernate QueryOver 与WhereRestriction 为 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24608118/

相关文章:

Azure 上的 Nhibernate HiLo

c# - 使用 Or 运算符而不是 And 将两个子查询添加到查询中?

javascript - 删除页面重新加载时的查询字符串

asp.net-mvc - Outlook 2010 忽略我的应用程序生成的 Web 日历 (ICS) 的 VALARM

c# - ASP.NET 多层应用程序迁移到 ASP.NET Core

asp.net-mvc - 使用 ASP.NET MVC,有没有办法捕获所有 POST 请求,而不管主机的 URL 是什么?

winforms - 使用 NHibernate 在多个数据库之间复制实体

NHibernate 标准集合包含

nhibernate - QueryOver IList<string> 属性

sql - NHibernate 等效于 SQL IsNull(列, 'defaultValue')