2010-05-16 2 views
0

У меня есть объект person, который может иметь неограниченное количество первых имен. Итак, первые имена - это еще один объект.Вопрос о NHibernate Критерии

т.е.

человека --- имя
            --- имя
            --- имя

То, что я хочу сделать, это написать запрос 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); 

Но это возвращает каждого человека с ЛЮБОЙ из имен, которые я ищу, а не ВСЕ имена.

Может ли кто-нибудь помочь мне с этим? Благодаря!

ответ

1

Должно ли это быть И-выражение тогда?

Как это:

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

EDIT

Ok. Для соответствия запроса вы дали выше, с небольшим изменением, чтобы избежать присоединения:

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

Это требует, чтобы у вас есть отображенное свойство с именем Person на имя класса.

+0

хорошо, то вы получите SQL, где имя как «% JANE%» и имя как «% Филиппы%», который не делает действительно ли это имеет смысл? –

+0

одно имя должно быть либо «philippa jane», либо «jane philippa» для этого - не одно имя «jane» и одно имя «philippa» .... –

+0

Ok. Я должен научиться читать более внимательно. Я обновил ответ, чтобы отразить ваш sql выше. – asgerhallas

0

Существуют различные способы, которыми это можно сделать. Вы можете использовать подзапрос существует для каждого имени. Или, вы можете присоединиться к именам, добавить name like '%blah%' для каждого имени, группы по персоне и добавить having count(*) = nameCnt. Однако предложение Where не поддерживается в ICriteria, поэтому вам нужно использовать HQL.

0

Это своего рода 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%' 
) 
+0

Вы должны отредактировать вопрос, вместо того чтобы добавить это как ответ – dotjoe

Смежные вопросы