Nhibernate ICriteria приводит к выбору N + 1 при использовании ограничений - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть класс A, у которого есть список B, и мне нужно отфильтровать по C

Вот карты

AMap

public AMap()
    {
    Id(x => x.IdA, "IdA").GeneratedBy.Identity();
    HasMany<B>(x => x.B)
        .BatchSize(50)
        .KeyColumn("IdA")
        .Cascade
        .AllDeleteOrphan()
        .Inverse()
        .Not.LazyLoad();  
}

BMap

 public BMap()
        {

            Id(x => x.IdB, "IdB").GeneratedBy.Identity();


            References(x => x.C, "IdC").LazyLoad();
            References(x => x.A, "IdA").LazyLoad(); 

            Setup();
        }

И мой код извлечения

//listC is a List<C> passed to the method


            var criteria = DetachedCriteria.For<A>()
                           .CreateCriteria("B", "b")                                    
                                .Add(Restrictions.Or(
                                        Restrictions.In("C.IdC", listC.Select(ug => ug.IdC).ToArray()),
                                        Restrictions.IsNull("C.IdC")))
                                .SetResultTransformer(Transformers.AliasToEntityMap);


            var result = criteria.GetExecutableCriteria(Session);



            return list;

Отчеты NHibernate Profiler Выберите N + 1, и производительность будет ужасной.

Я пытался также с QueryOver, но я не мог отфильтровать свои результаты на основе моей бизнес-логики

В конце концов, после 9 часов, стуча головой по нему, я сдался.

Любойпомощь приписывается

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