NHibernate搜索N+1问题

NHibernate搜索N+1问题,nhibernate,lucene.net,nhibernate.search,Nhibernate,Lucene.net,Nhibernate.search,我正在使用NHibernate搜索NHibernate 3.0 GA 我的产品存储库中有以下代码: public IList<Product> Find(string term) { var productFields = new[] { "Name", "Description" }; var importance = new Dictionary<String, float>(2) { { "Name",

我正在使用NHibernate搜索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;
        }

我真的不想急于获取所有类别。

您是否引用了此方法返回的产品列表中任何延迟加载的属性?如果是这样的话,您可以将属性映射更改为eager fetch。

因为NHibernate.Search不稳定,我会直接从我的应用程序使用Lucene.NET,只是要求Lucene提供对象ID,然后使用Session.load加载它

您还可以在类映射级别而不是关系级别更改LazyLoad设置。 希望能有帮助


编辑:您可以为关系指定批量大小,这样它们就不会导致选择N+1问题

我最终解决了这个问题。我意识到我没有把整件事都打包成交易。一旦我这样做了,N+1问题就消失了。
学生错误,但是,嘿,你从错误中学习。

我已经添加了我的映射作为编辑。你是说我应该立即加载我的产品。类别。。。我该怎么做?用FetchType.Join替换.LazyLoad?你说的不稳定是什么意思?我通过获取相关字段和聚合结果,将应用程序的索引时间从大约20分钟缩短到不到20秒。用NHibernate.Search是不可能的。
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();