Как написать подзапросы в качестве псевдонимов, используя Criteria Api с NHibernate - PullRequest
1 голос
/ 07 января 2011

Эй, ребята, скажите, что у меня есть сущности и сопоставления, подобные этому:

public class Episode
{
    Guid Id {get;set;}
    String Title {get;set;}
    List<Group> Groups {get;set;}
}

public class Group
{
    Guid Id {get;set;}
    DateTime PubDate {get;set;}
}

public class EpisodeMap : ClassMap<Episode>
{
    public EpisodeMap()
    {
        //other mappings..
        Map.HasMany(ep => ep.Groups);
    }
}

Итак, в основном в Эпизоде ​​много групп. У каждой группы есть PubDate, поэтому у Episode много PubDates.

Я пытаюсь написать запрос с помощью API NHibernate Criteria, который позволяет мне запрашивать эпизоды и упорядочивать их по PubDate, учитывая, что у меня есть идентификатор группы.

По сути, как мне написать эквивалентный запрос API Criteria для этого запроса SQL:

Select 
    e.*, 
    (Select top 1 ReleaseDate From EpisodeGroups where EpisodeFk = e.Id and GroupFk = @GroupId) as myPubDate 
From Episodes e 
Order By myPubDate

Пожалуйста, помогите! ура ребята

1 Ответ

3 голосов
/ 11 января 2011
public DetachedCriteria BuildCriteria(int episodeId, int groupId)
{

    var groupCriteria = DetachedCriteria.For<Groups>()
        .Add(Restrictions.Eq("this.Id", groupId))
        .Add(Restrictions.Eq("Group.Id", groupId)) 
        .AddOrder(Order.Asc("Group.PubDate"));

    return DetachedCriteria.For<EpisodeGroups>()
               .Add(Restrictions.Eq("this.Id", episodeId))
               .Add(Subqueries.PropertyIn("this.Groups", groupCriteria)
               .SetMaxResult(1);
}

Тогда вы можете сделать что-то вроде этого ...

var episodes = _repository.ExectueCriteria<EpisodeGroups>(BuildCriteria(episodeId, groupId))

В качестве особого соображения, причина, по которой вы захотите загружать объект Group, заключается в том, если вы хотитеиспользуйте LINQ для последующего сравнения PUBDATE в вашей бизнес-логике, в отличие от использования строгих отдельных критериев.

Мы обнаружили, что при быстрой загрузке атрибутов сущности уменьшается общее количество обращений в нашу базу данных.

Нет гарантий, что этот код работает ... но, по крайней мере, он должен начать, удачи:)

...