NHibernate针对集合项的带条件查询

NHibernate针对集合项的带条件查询,nhibernate,Nhibernate,我在数据库中有以下配置 我希望能够查询员工或供应商的所有个人。在我所看到的例子中,我没有一个能起作用。代码没有抛出错误,只是没有返回任何记录 这是DTO的 public class Individual { public virtual int Sid { get; set;} public virtual string Id { get; set; } public virtual string FirstName { get; set; } public

我在数据库中有以下配置

我希望能够查询员工或供应商的所有个人。在我所看到的例子中,我没有一个能起作用。代码没有抛出错误,只是没有返回任何记录

这是DTO的

public class Individual
{
    public virtual int Sid { get; set;}
    public virtual string Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string MiddleInitial { get; set; }
    public virtual ISet<Company> Companies { get; set; }
}

public class Company
{
    private bool _inactive;

    public virtual int Sid { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Individual> Individuals { get; set; }
    public virtual bool Active
    {
        get { return !_inactive; }
        set { _inactive = value; }
    }
    public virtual bool IsVendor { get; set; }
}

public class IndividualCompany
{
    public virtual Individual Individual { get; set; }
    public virtual Company Company { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        IndividualCompany key = obj as IndividualCompany;
        if (key == null)
            return false;

        if (Individual.Sid == key.Individual.Sid && Company.Sid == key.Company.Sid)
            return true;

        return false;
    }

    public override int GetHashCode()
    {
        int hash = 13;

        hash = 7 * hash * Individual.Sid.GetHashCode();
        hash = 7 * hash * Company.Sid.GetHashCode();

        return hash;
    }
}
以下是我尝试过的:

public IList<Individual> Get(bool vendorsOnly)
{
    try
    {
        return _session.CreateCriteria<Individual>()
            .CreateAlias("Company", "c")
            .Add(Restrictions.Eq("c.IsVendor", vendorsOnly))
            .List<Individual>();
    }
    catch (NHibernate.HibernateException)
    {
        throw;
    }
}
public IList Get(仅限布尔供应商)
{
尝试
{
返回_session.CreateCriteria()
.CreateAlias(“公司”、“c”)
.Add(Restrictions.Eq(“c.IsVendor”,仅限卖方))
.List();
}
捕获(NHibernate.hibernateeexception)
{
投掷;
}
}

我没有用FluentNHibernate。非常感谢您的帮助。

即使您在查询中引用了联接表的列,nHibernate查询也不会自动与其他表联接

必须明确声明查询应与Company表联接

下面是一个有效的例子。它使用
QueryOver
语法,这是围绕CriteriaAPI的类型安全包装

return _session
           .QueryOver<Individual>()
           .JoinQueryOver<Company>(i => i.Companies>())
           .Where(c => c.IsVendor == vendorsOnly)
           .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
           .List();
return\u会话
.QueryOver()
.JoinQueryOver(i=>i.companys>())
.其中(c=>c.IsVendor==vendorsOnly)
.TransformUsing(NHibernate.Transform.Transformers.DistincTroperty)
.List();

即使在查询中引用联接表的列,nHibernate查询也不会自动与其他表联接

必须明确声明查询应与Company表联接

下面是一个有效的例子。它使用
QueryOver
语法,这是围绕CriteriaAPI的类型安全包装

return _session
           .QueryOver<Individual>()
           .JoinQueryOver<Company>(i => i.Companies>())
           .Where(c => c.IsVendor == vendorsOnly)
           .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
           .List();
return\u会话
.QueryOver()
.JoinQueryOver(i=>i.companys>())
.其中(c=>c.IsVendor==vendorsOnly)
.TransformUsing(NHibernate.Transform.Transformers.DistincTroperty)
.List();

谢谢你,安德鲁!你的解决方案完美无瑕+谢谢你,安德鲁!你的解决方案完美无瑕+1.
return _session
           .QueryOver<Individual>()
           .JoinQueryOver<Company>(i => i.Companies>())
           .Where(c => c.IsVendor == vendorsOnly)
           .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
           .List();