我是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>();
我做错了什么? 感谢
答案 0 :(得分:2)
实际上这一切都归结为你想做的事情。 首先,Criteria查询遵守映射定义(延迟/急切连接等),除非另外定义,否则所有内容都是惰性的(当然不包括值属性)
其次,CreateAlias方法定义要加入的实体,默认行为也是选择它们。
请注意,您正在致电
repository.CreateCriteria()
如果直接包装到nhSession.CreateCriteria(),那么您还没有完全定义 要选择的内容。 所以,试着做这个
nhSession.CreateCriteria(typeof(ClientInformation));
将被翻译为“仅选择ClientInformation”...