NHibernate CreateCriteria и CreateQuery генерирует разные sql? - PullRequest
2 голосов
/ 03 июня 2010

Я новичок в NHibernate и не могу понять, почему эти два оператора генерируют разные sql.

первый получит только ClientInformation (с информацией и клиентом будут прокси), что я и хочу.

return repository
            .CreateQuery("from ClientInformation ci where ci.Information.IsMandatory = true and ci.Client.Id = :clientId")
            .SetParameter("clientId", clientId)
            .List<ClientInformation>();

Второй порождает все. Все данные возвращаются для 3 объектов, а это не то, что я хочу

return repository.CreateCriteria()
            .CreateAlias("Information", "inf")
            .CreateAlias("Client", "cli")
            .Add(Expression.Eq("cli.Id", clientId))
            .Add(Expression.Eq("inf.IsMandatory", true))
            .List<ClientInformation>();

Что я делаю не так? спасибо

1 Ответ

2 голосов
/ 04 июня 2010

На самом деле все сводится к тому, что вы хотите сделать. Прежде всего запросы Criteria учитывают определения сопоставления (ленивые / активные соединения и т. Д.), Где в HQL-запросах с ограничениями, если не указано иное, все лениво (за исключением, конечно, свойств значений)

Во-вторых, метод CreateAlias ​​определяет, какие сущности нужно присоединить, и поведение по умолчанию также выбирает их.

Обратите внимание, что вы звоните

repository.CreateCriteria()

, и если это непосредственно относится к nhSession.CreateCriteria (), то вы не определили точно , что хотите выбрать. Итак, попробуйте сделать это

nhSession.CreateCriteria(typeof(ClientInformation));

, что будет переводиться как «выберите только ClientInformation» ...

...