C# NHibernate在一对多集合中生成奇数sql

C# NHibernate在一对多集合中生成奇数sql,c#,nhibernate,C#,Nhibernate,给定以下配置: 课程包括: 公共类实体 { 公共虚拟Guid Id{get;set;} } 公共类CategoryPerm:实体 { 公共虚拟类别{get;set;} 公共虚拟Guid PortalGroupId{get;set;} 公共虚拟IList组成员身份{get;set;} public CategoryPerm() { GroupMemberships=新列表(); } } 公共类GroupMembership:实体 { 公共虚拟Guid ParentPrincipalId{get

给定以下配置:


课程包括:

公共类实体
{
公共虚拟Guid Id{get;set;}
}
公共类CategoryPerm:实体
{
公共虚拟类别{get;set;}
公共虚拟Guid PortalGroupId{get;set;}
公共虚拟IList组成员身份{get;set;}
public CategoryPerm()
{
GroupMemberships=新列表();
}
}
公共类GroupMembership:实体
{
公共虚拟Guid ParentPrincipalId{get;private set;}
公共虚拟Guid MemberPrincipalId{get;private set;}
}
以及以下linq查询:

var categories=(从nhs.Linq()中的x开始,其中x.GroupMemberships.Any(y=>y.MemberPrincipalId==PortalUser.Current.ID)选择x.ToList();

为什么NH提出的sql看起来是这样的:(问题之一是“exists()”部分,其中这个0_u0.Id=ParentPrincipalID“看起来这是NH 2.x Linq提供程序中的一个错误。我最终去了ICriteria,现在它工作起来很有魅力

nhs.CreateCriteria<CategoryPerm>("a").CreateCriteria("a.Category", "b").CreateCriteria("a.GroupMemberships", "c").Add(
                Restrictions.Eq("c.MemberPrincipalId", PortalUser.Current.ID.AsGuid)).List<CategoryPerm>();
nhs.CreateCriteria(“a”).CreateCriteria(“a.Category”、“b”).CreateCriteria(“a.GroupMemberships”、“c”)。添加(
Restrictions.Eq(“c.MemberPrincipalId”,PortalUser.Current.ID.AsGuid)).List();

对于您提供的linq查询,生成的SQL看起来是正确的,它是为您使用的
任何
api生成的。它非常接近正确,但不完全正确。请注意其中的“this\u 0\u.Id=ParentPrincipalID”。它应该是“this\u 0\u.portalgroup Id=ParentPrincipalID”就像它在父SQL中的from中的join中所做的那样。因此linq在大多数语句中都考虑父>子语句的列,但在“exists”部分它似乎只是忽略了它。