Выпуск NHibernate N + 1 - PullRequest
       30

Выпуск NHibernate N + 1

0 голосов
/ 03 июня 2011

Я использую NHibernate Search для NHibernate 3.0 GA.

У меня есть этот код в моем репозитории продукта:

public IList<Product> Find(string term)
        {
            var productFields = new[] { "Name", "Description" };
            var importance = new Dictionary<String, float>(2) { { "Name", 4 }, { "Description", 1 } };
            var analyzer = new StandardAnalyzer();
            var parser = new MultiFieldQueryParser(
                productFields,
                analyzer,
                importance);

            var query = parser.Parse(term);

            var session = Search.CreateFullTextSession(NHibernateSession.Current);
            var tx = session.BeginTransaction();
            var fullTextQuery = session.CreateFullTextQuery(query);
            fullTextQuery.SetFirstResult(0).SetMaxResults(20);
            var results = fullTextQuery.List<Product>();
            tx.Commit();

            return results;
        }

В NH Profiler я вижу, что для каждого найденного продукта выдается оператор выбора. Чего мне не хватает?

Я нашел эту тему с 2009 года, но, вероятно, эта ошибка была исправлена.

РЕДАКТИРОВАТЬ [06/06/2011]:

Мое сопоставление свойств в отношении ассоциаций выглядит следующим образом:

mapping.HasManyToMany(c => c.Categories)
                .Table("CatalogHierarchy")
                .ParentKeyColumn("child_oid")
                .ChildKeyColumn("oid")
                .Cascade.None()
                .Inverse()
                .LazyLoad()
                .AsSet();

            mapping.HasMany(c => c.Variants)
                .Table("CatalogProducts")
                .Where("i_ClassType=2")
                .KeyColumn("ParentOID")
                .Cascade.SaveUpdate()
                .AsSet();

Я не очень хочу получать все категории.

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Поскольку NHibernate.Search нестабилен, я бы использовал (и я использовал) Lucene.NET непосредственно из своего приложения - просто чтобы запросить у Lucene идентификаторы объектов и затем загрузить его, используя Session.Load().

Также вы можете изменить настройки LazyLoad на уровне отображения классов, а не на уровне отношений. Надеюсь, это поможет.

РЕДАКТИРОВАТЬ : вы можете указать размер пакета для отношений, чтобы они не вызывали проблему выбора N + 1

0 голосов
/ 27 января 2012

Я решил это в конце концов.Я понял, что я не заключил все это в сделку.Как только я это сделал, проблема N + 1 исчезла.Ошибка школьника, но эй, ты учишься на своих ошибках.

0 голосов
/ 05 июня 2011

Вы ссылаетесь на какие-либо лениво загруженные свойства в списке продуктов, который возвращается этим методом?Если это так, вы можете изменить отображение свойств на «eager fetch».

...