1

やあみんな、私はこのようなエンティティとマッピングを持っていると言います:

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があるため、エピソードには多くのPubDateがあります。

NHibernate Criteria APIを使用してクエリを作成しようとしています。これにより、エピソードをクエリし、グループIDがある場合はPubDateで並べ替えることができます。

基本的に、このSQLクエリと同等のCriteriaAPIクエリを作成するにはどうすればよいですか。

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

助けてください!みんな乾杯

4

1 に答える 1

3
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))

特別な考慮事項と同様に、グループエンティティを熱心にロードする理由は、厳密な分離基準を使用するのではなく、後でLINQを使用してビジネスロジックでPUBDATEを比較する場合に使用します。

エンティティの属性を熱心にロードすることで、データベースへの呼び出しの総数が減ることがわかりました。

このコードが機能するという保証はありません...しかし、少なくともあなたが始められるはずです、頑張ってください:)

于 2011-01-11T03:35:54.797 に答える