Как добавить предложение where для дочерних элементов в Castle ActiveRecord - PullRequest
0 голосов
/ 31 января 2012

Я использую Castle 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 легко)

1 Ответ

2 голосов
/ 31 января 2012

Для объединения вы можете использовать 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.Для возврата и команды, и участников в одной выборке вы можете использовать преобразователь результатов NHibernate Проекции в NHibernate

...