NHibernate:使用OR运算符进行查询

NHibernate:使用OR运算符进行查询,nhibernate,reference,criteria,icriteria,Nhibernate,Reference,Criteria,Icriteria,我正在寻找一种方法,将OR运算符构建到查询中,以便在表的一个字段以及联接表的另一个字段中查找特定值。这在SQL中是非常基本的,但我无法在NHibernate中完全理解如何做到这一点。我一直在搜索web,但我发现的示例对我来说非常模糊,我发现它们很难应用到我的特定实现中 我有一个名为Party的类,有一个名为reference的字符串字段,它是主引用。新的要求要求还可以选择向一方添加大量的侧引用。所以我不得不添加另一个名为PartyReference的类,它与Party有多对一的关系 现在有了一个

我正在寻找一种方法,将OR运算符构建到查询中,以便在表的一个字段以及联接表的另一个字段中查找特定值。这在SQL中是非常基本的,但我无法在NHibernate中完全理解如何做到这一点。我一直在搜索web,但我发现的示例对我来说非常模糊,我发现它们很难应用到我的特定实现中

我有一个名为Party的类,有一个名为reference的字符串字段,它是主引用。新的要求要求还可以选择向一方添加大量的侧引用。所以我不得不添加另一个名为PartyReference的类,它与Party有多对一的关系

现在有了一个给定的引用,我必须在这个主引用字段和边引用中查找它的值。但是,只要我不能向NHibernate说明这个字段必须与值或其他字段中的一个对应,我就无法使它工作

我做了一个看起来像这样的变通方法,但它既不雅观又愚蠢,因为必须有一种方式来说“或”:

public Party GetPartyOnAnyReference(字符串引用)
{
政党;
ISession session=Factory.OpenSession();
ITransaction tx=会话.BeginTransaction();
尝试
{
//主要参考文献的首次检索
ICriteria criteria1=会话.CreateCriteria(类型(参与方));
标准1.增加(限制条件,等式(“参考”,参考));
IList parties1=criteria1.List();
party=parties1.计数>0?parties1[0]:空;
//然后尝试使用侧引用
如果(参与方==null)
{
ICriteria criteria2=会话.CreateCriteria(类型(参与方));
准则2
.SetFetchMode(“参考”,FetchMode.Eager)
.CreateCriteria(“参考”)
.添加(表达式.Eq(“参考”,参考));
IList parties2=criteria2.List();
party=parties2.Count>0?parties2[0]:空;
}
session.Close();
}
捕获(例外e)
{
tx.回滚();
session.Close();
if(例如GetType().ToString()=“NHibernate.ObjectNotFoundException”)
参与方=空;
否则扔;
}
返回方;
}
当然,我也意识到,我可以通过简单地从党纲中删除主要参考,并与其他参考文献同等对待,作为党派参考来解决这个问题。但在某个阶段,我将不得不对NHibernate使用OR查询,所以我现在可以用这个特殊的例子来解决它


有什么想法吗

您可以使用
限制。或
或对多个Or使用析取

session.CreateCriteria<Party>()
    .CreateAlias("References", "r", JoinType.LeftOuterJoin)
    .Add(Restrictions.Or(
        Restrictions.Eq("Reference", reference),
        Restrictions.Eq("r.Reference", reference)))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Party>();
session.CreateCriteria()
.CreateAlias(“引用”、“r”、JoinType.LeftOuterJoin)
.添加(限制)或(
限制。等式(“参考”,参考),
限制条件(等式(“r.参考”,参考)))
.SetResultTransformer(新DistincTrotentyResultTransformer())
.List();

您可以使用
限制。或
或对多个Or使用析取

session.CreateCriteria<Party>()
    .CreateAlias("References", "r", JoinType.LeftOuterJoin)
    .Add(Restrictions.Or(
        Restrictions.Eq("Reference", reference),
        Restrictions.Eq("r.Reference", reference)))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Party>();
session.CreateCriteria()
.CreateAlias(“引用”、“r”、JoinType.LeftOuterJoin)
.添加(限制)或(
限制。等式(“参考”,参考),
限制条件(等式(“r.参考”,参考)))
.SetResultTransformer(新DistincTrotentyResultTransformer())
.List();

非常感谢!这正是我正在寻找的优雅解决方案。为了相信自己的眼睛,我不得不多次运行单元测试。万分感谢!这正是我正在寻找的优雅解决方案。为了相信自己的眼睛,我不得不多次运行单元测试。