为什么这两个NHibernate查询产生不同的结果?

为什么这两个NHibernate查询产生不同的结果?,nhibernate,criteria,linq-to-nhibernate,Nhibernate,Criteria,Linq To Nhibernate,这适用于M:N关系,集合作为一个集合映射到NHibernate中 我们以前使用的条件查询有效,但它没有正确填充技能集合,因为只有第一个/寻找的技能被记录下来,即使该员工有多个技能 我将其更改为LINQ查询,它修复了问题,正确地获取了该员工的所有技能 Dim sId=1'仅为有一个示例 Dim lstEmployees=Session.CreateCriteriaOf Employees_ .CreateAliasSkills,s,NHibernate.SqlCommand.JoinType.Le

这适用于M:N关系,集合作为一个集合映射到NHibernate中

我们以前使用的条件查询有效,但它没有正确填充技能集合,因为只有第一个/寻找的技能被记录下来,即使该员工有多个技能

我将其更改为LINQ查询,它修复了问题,正确地获取了该员工的所有技能

Dim sId=1'仅为有一个示例 Dim lstEmployees=Session.CreateCriteriaOf Employees_ .CreateAliasSkills,s,NHibernate.SqlCommand.JoinType.LeftOuterJoin_ .AddExpression.OrExpression.EqPrimarySkillId,sId, 表达式.Eqs.Id,sId_ .SetResultTransformer新distinctrotenty结果变压器_ .雇员名单 “返回正确的员工,但仅返回他们在技能集合中的第一项技能,即使他们拥有多个技能 Dim lstEmployees=来自Session.QueryOf Employees中的e 其中e.PrimarySkillId=sId或e.Skills.AnyFunctions s.Id=sId 选择e.Distinct.fetchfunction e.Skills.ToList '返回正确的员工,他们的技能集合包含他们的所有技能
有人知道这两个看似相同的查询有什么不同吗?

一开始,第一个查询在检索所有行后进行不同的分离,而第二个查询实际上执行选择不同的。。。。可能发生的情况是,它将员工模型与检索到的一项技能结合起来

要使第一个查询实际执行select distinct。。。您将需要使用投影

差不多

Session.CreateCriteria的员工_ .CreateAliasSkills,s,NHibernate.SqlCommand.JoinType.LeftOuterJoin .AddExpression.OrExpression.EqPrimarySkillId,sId, 表达式.Eqs.Id,sId_ .SetProjectionProjections.d_ .SetFetchModes,FetchMode.Eager 可能有用。或者,您可以尝试使用DistinctRootEntityResultTransformer设置获取模式

Session.CreateCriteria的员工_ .CreateAliasSkills,s,NHibernate.SqlCommand.JoinType.LeftOuterJoin .AddExpression.OrExpression.EqPrimarySkillId,sId, 表达式.Eqs.Id,sId_ .SETRESULT变压器变压器.DISTINCTROUNTITY变压器_ .SetFetchModes,FetchMode.Eager
您是否比较了两者生成的SQL查询?这应该会给你一个提示,告诉你问题是什么。是的,但我不知道为什么它会有所不同,因为我觉得它在代码中看起来是一样的。第二个查询使用了EXISTS语句子查询,而第一个查询根本没有这样做;我曾尝试过SetFetchMode,但我在CreateAlias之前就尝试过了,我也尝试过SetFetchModeSkills,FetchMode.Eager。它似乎不起作用,所以也许它是最后一个还是使用别名s很重要?谢谢Vadim,我两种方法都试过了,但都不起作用。对于第一个,它似乎只选择Id属性,无法将其转换为员工列表。对于第二个,它仍然是具有相同结果的相同查询。我想知道,根据LINQ的说法,这是一个EXISTS子查询。也许一个独立的标准会起作用?“不过我不知道如何才能很好地做到这一点。”subkamran,这将是我的下一个建议,但这些建议有点复杂。LINQ工作得很好,我同意,但FetchMany在NH3.1和VB.NET中被破坏了。我想取一些孙子的记录,但我不能,直到他们修复它,所以这就是为什么我有兴趣让这个工作的标准。