2012-01-31 41 views
0

我使用城堡的ActiveRecord和子句創建兩個實體如下:如何添加,其中在城堡的ActiveRecord子項

[ActiveRecord("Teams")] 
public class Team : ActiveRecordLinqBase<Team> 
{ 
    public Team() 
    { 
     Members = new List<Member>(); 
    } 

    [PrimaryKey] 
    public int Id { get; set; } 

    [Property("TeamName")] 
    public string Name { get; set; } 

    [Property] 
    public string Description { get; set; } 

    [HasMany(Inverse = true, 
      Lazy = true, 
      Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)] 
    public virtual IList<Member> Members { get; set; } 
} 

[ActiveRecord("Members")] 
public class Member : ActiveRecordLinqBase<Member> 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 

    [Property] 
    public string FirstName { get; set; } 

    [Property] 
    public string Lastname { get; set; } 

    [Property] 
    public string Address { get; set; } 

    [BelongsTo("TeamId")] 
    public Team Team { get; set; } 
} 

我用ICriterion有過濾球隊數據

IList<ICriterion> where = new List<ICriterion>(); 
where.Add(Expression.Eq("Name", "name1")); 
ICriterion[] criteria = where.ToArray(); 

var teams = Team.FindAll(criteria); 

所以遠遠好用,但我想在Members表上添加另一個過濾器。結果查詢會是這樣的

select * 
    from Teams t join Member m on t.Id = m.TeamId 
where t.Name = 'name1' 
    and m.Address = 'address' 

如何使用ICriterion完成此操作? 我的意思是如何爲Team.Members屬性添加標準。 不使用LINQ。 (我知道這很容易使用LINQ來完成)

回答

2

對於連接可以使用 的DetachedCriteria

DetachedCriteria criteriaTeam = DetachedCriteria.For<Team>(); 
DetachedCriteria criteriaMember = criteriaTeam .CreateCriteria("Members"); 
criteriaTeam .Add(Expression.Eq("Name", "name1")); 
criteriaMember.Add(Expression.Eq("Address", "address")); 
ICriteria executableCriteria = criteriaTeam .GetExecutableCriteria(session); 
executableCriteria.List<Team>(); 

這隻會返回Team.To在一個單一的返回團隊和成員接你可以使用NHibernate的結果變壓器Projections in NHibernate

+0

感謝an2,你的代碼似乎使用NHibernate因爲會話,我的情況是Castle ActiveRecord,無論如何,我從你的代碼中得到了這個想法。 – Ray 2012-02-01 00:53:45