2010-05-16 92 views
0

我有一個人對象,它可以有無限數量的名字。所以名字是另一個對象。NHibernate標準問題

人---名
            ---名
            ---名

我想要做的是寫使用它的禁止查詢會讓我成爲具有某些名字的人。

所以一個查詢可能會找到名字是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

不應該是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")))); 
    } 

這就需要你對名稱命名的類人一個對應的屬性。

+0

那麼,你得到的SQL WHERE名稱LIKE「%簡%」和名稱,如「%菲利帕%」,這不真的有道理嗎? – 2010-05-17 16:44:45

+0

這個名字必須是「philippa jane」或者「jane philippa」才能發揮作用 - 不是「jane」的名字和「philippa」的名字...... – 2010-05-17 16:45:49

+0

好的。我必須學會更仔細地閱讀。我已經更新了答案,以反映你的SQL以上。 – asgerhallas 2010-05-17 21:11:41

0

這可以通過多種方式完成。您可以爲每個名稱使用存在的子查詢。或者,您可以加入姓名,爲每個姓名添加name like '%blah%',按人羣添加having count(*) = nameCnt。然而,Having條款在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 2010-05-17 21:32:27