Nhibernate HQL, где IN запрос - PullRequest
       27

Nhibernate HQL, где IN запрос

11 голосов
/ 08 марта 2010

Я пытаюсь вернуть список SimpleQuery, который запрашивает одну таблицу и использует IN. Я могу заставить это работать, используя

return new List<Jobs>(
    ActiveRecordMediator<Jobs>.FindAll(Expression.In("ServiceId", ids))
);

Однако это действительно очень медленно. Так что я хотел бы сделать что-то вроде этого

SimpleQuery<Job> query = 
    new SimpleQuery<Job>(@"from Job as j where ? in (j.ServiceId)", ids);

return new List<Job>(query.Execute());

Однако я не могу заставить SimpleQuery работать. Я не могу найти какую-либо документацию, касающуюся этого, и надеялся, что кто-нибудь сможет помочь.

Спасибо

1 Ответ

23 голосов
/ 08 марта 2010

Ознакомьтесь с документацией по Hibernate NHQL здесь .

Я полагаю из вашего кода, что вы после HQL-запроса возвращаете все задания, где job.ServiceID в списке идентификаторов.

Может быть, что-то в этом роде,

IQuery q = s.CreateQuery("from Job as j where j.ServiceId in (:serviceIds)");
q.SetParameterList("serviceIds", ids); 

Кстати, вы слышали о проекте NHibernate Lambda Extensions ? Ниже приведен пример запроса IN, выполненного с использованием упомянутой библиотеки. Может быть что-то интересное в качестве альтернативы использованию HQL.

DetachedCriteria after =
    DetachedCriteria.For<Person>()
        .Add(SqlExpression.In<Person>(p => p.Name, 
          new string[] { "name1", "name2", "name3" }));
...