编辑 2:好吧,我对 SO 进行了另一次搜索,我认为你应该看看这个答案。我无法重现您的问题,所以要么这里有其他东西(您的配置或域模型?),要么我完全错过了重点。祝你好运!
我将在这里尝试猜测原因(我不使用 C# 或 hql,所以如果它在这个领域,我可能不走运)。我认为您看到的是因为您使用了该.List()
方法的无类型版本。您应该尝试使用.List<T>()
它来指定您在列出实体时所期望的类型。
我觉得
foreach (var doc in query.List <T>
()) { fullTextSession.Index(doc); }
应该做的伎俩。
编辑:好的,显然它不适用于添加的<T>
(显然代码片段吃了括号,所以如果你这样做了,请确保你复制粘贴了正确的版本)。
FWIW,我们正在做的工作如下。我们使用 UnitOfWork 模式,因此 UnitOfWork 启动当前的 Nhibernate 配置和会话。我使用 Reflector 从 Vb.net 转到 c#
DocumentBuilder db = SearchFactoryImpl.GetSearchFactory(UnitOfWork.Configuration).GetDocumentBuilder(typeof(T));
IList<T> results = null;
PropertyInfo pi = typeof(T).GetProperty("Id");
// an internal method that pages the data from the DB, returning true while there's more to process
while (this.InnerPageThrough<T>(ref results, pageNumber, itemsPerPage))
{
IndexWriter iw = new IndexWriter(this.CheminIndexation + @"\" + typeof(T).Name, new StandardAnalyzer(), false);
iw.SetMaxMergeDocs(0x186a0);
iw.SetMergeFactor(0x3e8);
iw.SetMaxBufferedDocs(0x2710);
iw.SetUseCompoundFile(false);
using (Timer.Start("indexing + Conversions.ToString(results.Count) + " objects " + typeof(T).Name))
{
// Sorry, looks like crap through the translation
IEnumerator<T> VB$t_ref$L3;
try
{
VB$t_ref$L3 = results.GetEnumerator();
while (VB$t_ref$L3.MoveNext())
{
T Entity = VB$t_ref$L3.Current;
object EntityId = RuntimeHelpers.GetObjectValue(pi.GetValue(Entity, null));
iw.AddDocument(db.GetDocument(Entity, RuntimeHelpers.GetObjectValue(EntityId), typeof(T)));
}
}
finally
{
if (VB$t_ref$L3 != null)
{
VB$t_ref$L3.Dispose();
}
}
}
iw.Flush(true, true, true);
iw.Close();
UnitOfWork.CurrentSession.Clear();
pageNumber++;
}
if (Optimize)
{
using (Timer.Start("optimising index"))
{
IndexWriter iw = new IndexWriter(this.CheminIndexation + @"\" + typeof(T).Name, new StandardAnalyzer(), false);
iw.Optimize();
iw.Close();
}
}
}
}
}
我将尝试以更精简的方式重现您的问题