NHibernate Query w/ criteria against collection items

NHibernate Query w/ criteria against collection items

我在数据库中有如下配置。

Database Schema

我希望能够查询他们是雇员还是供应商的所有个人。在我见过的例子中,我无法让它们中的任何一个工作。该代码不会引发错误,它只是不会带回任何记录。

这是 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;
    }
}

我有另一个使用这 3 个表的函数,我的所有个人和公司集合都得到了很好的填充,所以我知道映射正在工作。就是不知道怎么给子记录加条件

string sql = "from Individual i" +
        " inner join fetch i.Companies";
return _session.CreateQuery(sql).List<Individual>();

这是我希望它生成的查询。

select i.*
  from individual i inner join individual_company_assoc ica
    on i.individual_sid = ica.individual_sid
 inner join company c
    on ica.company_sid = c.company_sid
 where c.is_vendor = 0

这是我试过的方法:

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;
    }
}

我没有使用 FluentNHibernate。任何帮助将不胜感激。

nHibernate 查询不会自动与其他 table 连接,即使您在查询中引用了连接 table 的列。

您必须明确声明查询应加入公司 table。

这是一个可行的示例。它使用 QueryOver 语法,这是一个围绕 Criteria API.

的类型安全包装器
return _session
           .QueryOver<Individual>()
           .JoinQueryOver<Company>(i => i.Companies>())
           .Where(c => c.IsVendor == vendorsOnly)
           .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
           .List();