NHibernate CreateCriteria和CreateQuery生成不同的sql?

时间:2010-06-03 16:53:55

标签: nhibernate createcriteria createquery

我是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 个答案:

答案 0 :(得分:2)

实际上这一切都归结为你想做的事情。 首先,Criteria查询遵守映射定义(延迟/急切连接等),除非另外定义,否则所有内容都是惰性的(当然不包括值属性)

其次,CreateAlias方法定义要加入的实体,默认行为也是选择它们。

请注意,您正在致电

repository.CreateCriteria()

如果直接包装到nhSession.CreateCriteria(),那么您还没有完全定义 要选择的内容。 所以,试着做这个

nhSession.CreateCriteria(typeof(ClientInformation));

将被翻译为“仅选择ClientInformation”...