Как я могу сделать этот запрос с NHibernate - PullRequest
2 голосов
/ 04 декабря 2010

Как я могу сделать этот запрос с NHibernate

select top 10 count(distinct classedition.createdby_id) as editions, class.id,
       class.name, class.createdon, class.createdby_id
from class 
inner join classedition on class.id = classedition.class_id
group by class.id, class.name, class.createdon, class.createdby_id
order by editions desc, class.createdon desc

Я использую NHibernate 3. Я пытался сделать это с новым провайдером Linq безуспех.Меня не волнует способ сделать это, пока он производит точный SQL-запрос выше.Я бы предпочел написать строго типизированный запрос, без магической строки, если это возможно.

Я новичок в NHibernate, поэтому этот вопрос может быть простым.

Вот немного больше информации

Я использую Fluent NHibernate с AutoMappings.Классы C # очень просты:

public  class Class
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual DateTime CreatedOn { get; set; }
}

public class ClassEdition
{
    public virtual int Id { get; set; }
    public virtual Class Class { get; set; }
    public virtual User CreatedBy { get; set; }
}

public class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Я наконец-то решил проблему с помощью View.

Я не хочу быть грубым, но кажется, что сообщество NHibernate более склонно спорить о том, как я задаю вопрос, чем отвечаю на сам вопрос. Смотрите комментарии к ответу Диего Миджельшона. Я получил те же упреки (об использовании модульных тестов) на nhusers (группы Google): http://groups.google.com/group/nhusers/browse_thread/thread/4c74269aefb918fc

0 голосов
/ 04 декабря 2010

HQL-запросы строго типизированы и объектно-ориентированы.

var results = session.CreateQuery(@"
              select count(distinct e.CreatedBy), c.Id,
                     c.Name, c.CreatedOn, c.CreatedBy
              from ClassEditions e
              join e.Class c
              group by c.Id, c.Name, c.CreatedOn, c.CreatedBy
              order by 1 desc, c.CreatedOn desc
              ")
              .SetMaxResults(10)
              .List();

Ваш код на C # также является строкой. У NH также есть компилятор запросов.

На самом деле, если вы поместите запрос в файл сопоставления, вы даже сможете получить проверку на наличие ошибок и проверку в реальном времени, установив HQL Language Service для Visual Studio .

И простой модульный тест, который не делает ничего, кроме сборки SessionFactory, сообщит вам, если что-то сломалось из-за изменения. Не говоря уже о современных инструментах рефакторинга (таких как Resharper), которые могут без проблем переименовывать идентификаторы в строки, привязки или файлы любого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...