NHibernate标准问题

NHibernate标准问题,nhibernate,icriteria,Nhibernate,Icriteria,我有一个person对象,它可以有无限个名字。所以名字是另一个对象 即 人---姓名 ---名称 ---名称 我想做的是编写一个nhiberate查询,使用它可以得到一个有特定姓名的人 因此,一个查询可能是查找姓名为alison、jane和philippa的人,然后下一个查询可能是查找姓名为alison和jane的人 我只想返回那些拥有我搜索的所有姓名的人。到目前为止,我已经 ICriteria criteria = session.CreateCriteria(typeof (Person))

我有一个person对象,它可以有无限个名字。所以名字是另一个对象

人---姓名
---名称
---名称

我想做的是编写一个nhiberate查询,使用它可以得到一个有特定姓名的人

因此,一个查询可能是查找姓名为alison、jane和philippa的人,然后下一个查询可能是查找姓名为alison和jane的人

我只想返回那些拥有我搜索的所有姓名的人。到目前为止,我已经

ICriteria criteria = session.CreateCriteria(typeof (Person));
criteria.CreateAlias("Names", "name");
ICriterion expression = null;
foreach (string name in namesToFind)
{
    if (expression == null)
    {
        expression = Expression.Like("name.Value", "%" + name + "%");
    }
    else
    {
        expression = Expression.Or(
            expression,
            Expression.Like("name.Value", "%" + name + "%"));
    }
}

if (expression != null)
    criteria.Add(expression);
但这会返回每个人的名字,而不是所有的名字


有人能帮我解决这个问题吗?谢谢

那么它不应该是一个AND表达式吗

像这样:

    ICriteria criteria = session.CreateCriteria(typeof (Person));
    criteria.CreateAlias("Names", "name");
    foreach (string name in namesToFind)
    {
        criteria.Add(Expression.Like("name.Value", "%" + name + "%"));
    }
编辑

嗯。要匹配上面给出的查询,只需稍作更改以避免连接:

    ICriteria criteria = s.CreateCriteria(typeof(Person));
    foreach (string name in namesToFind)
    {
        criteria.Add(Subqueries.PropertyIn("Id",
            DetachedCriteria.For<Name>()
                .Add(Restrictions.Like("Value", name, MatchMode.Anywhere))
                .SetProjection(Projections.Property("Person"))));
    }
ICriteria标准=s.CreateCriteria(typeof(Person));
foreach(namesToFind中的字符串名称)
{
criteria.Add(subquerys.PropertyIn(“Id”),
DetachedCriteria.For()
.Add(限制,如(“值”、名称、匹配模式、任意位置))
.SetProjection(Projections.Property(“Person”));
}

这要求在Name类上有一个名为Person的映射属性。

有多种方法可以实现这一点。可以对每个名称使用exists子查询。或者,您可以在名称上加入,为每个名称添加一个
名称,如“%blah%”
,按个人分组,并添加一个
具有count(*)=nameCnt
。但是,ICriteria中不支持Having子句,因此您需要使用HQL。

这就是我想要得到的sql类型:

select * from person where Id in
(
select person.id from person inner join [name]
on person.id = name.personId
 where name.value like '%jane%'
)
and id in
(
select person.id from person inner join [name]
on person.id = name.personId
 where name.value like '%janice%'
) 
and id in
(
select person.id from person inner join [name]
on person.id = name.personId
 where name.value like '%louise%'
) 

那么您将得到sql,其中的名称像“%jane%”和名称像“%philippa%”,这实际上没有意义,是吗?一个名称必须是“philippa jane”或“jane philippa”才能起作用-而不是一个名称“jane”和一个名称“philippa”…好的。我必须学会更仔细地阅读。我已经更新了答案以反映上面的sql。您应该编辑问题,而不是将其添加为答案