2015-11-04 80 views
1

我在数据库中具有以下配置。NHibernate查询与条件收集项目

Database Schema

enter image description here

我希望能够查询所有,他们要么是员工或供应商的个人。在我看到的例子中,我无法让他们工作。代码不会抛出错误,它不会带回任何记录。

这里是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

。任何帮助将不胜感激。

回答

0

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

您必须明确声明查询应该与公司表一起加入。

这是一个可以工作的例子。它使用QueryOver语法,它是Criteria API的类型安全包装器。

return _session 
      .QueryOver<Individual>() 
      .JoinQueryOver<Company>(i => i.Companies>()) 
      .Where(c => c.IsVendor == vendorsOnly) 
      .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity) 
      .List(); 
+0

谢谢安德鲁!您的解决方案完美无瑕! +1 – Snaggs