0

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

在 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();

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

4

3 回答 3

1

由于 NHibernate.Search 不稳定,我会直接从我的应用程序中使用(并且我确实这样做了)Lucene.NET - 只是向 Lucene 询问对象的 Id,然后使用Session.Load().

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

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

于 2011-06-06T12:29:52.427 回答
0

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

于 2012-01-27T19:31:14.080 回答
0

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

于 2011-06-05T05:21:35.950 回答