Вы можете использовать ProgressInterceptor
класс для перехвата и сообщать о прогрессе, как это:
var interceptor = new ProgressInterceptor(progress);
var session = sessionFactory.OpenSession(interceptor);
var query = session.Query<Entity>()...
interceptor.StartIntercept<Entity>(0, 100, query.Count());
entities = query.Fetch(x => x.Chidren).ToList();
interceptor.StopIntercept();
А вот ProgressInterceptor
. Если вы получите исключение StackOverflowException, добавьте блокировку в функцию отчетов о ходе выполнения.
public class ProgressInterceptor : EmptyInterceptor
{
IProgress<int> progress;
int count;
double start;
double end;
double factor;
string className;
int? lastReport;
public ProgressInterceptor(IProgress<int> progress)
{
this.progress = progress;
}
public void StartIntercept<T>(double start, double end, int steps)
{
count = 0;
this.start = start;
this.end = end;
factor = (end - start)/steps;
className = typeof(T).FullName;
lastReport = null;
}
public void StopIntercept()
{
className = null;
}
public override object Instantiate(string clazz, EntityMode entityMode, object id)
{
if (className == clazz)
{
count++;
var newReport = (int)Math.Min(start + count * factor, end);
if (newReport != lastReport)
progress.Report(newReport);
lastReport = newReport;
}
return base.Instantiate(clazz, entityMode, id);
}
}
Вы не должны использовать NHibernate для такого рода вещей, но вместо этого вместо SQL. Или посмотрите на [SqlBulkCopy] (http://www.4guysfromrolla.com/articles/102109-1.aspx). – BCdotWEB
Ну, это очень удобно с NHibernate, так как я могу использовать свои стандартные запросы и не забудьте получить правильные данные. Также NHibernate обрабатывает различные базы данных довольно хорошо (SQL Server и SQLite) – Markus
В общем, я бы сказал, нет. Возможно, что-то можно сделать с помощью прослушивателей событий NHibernate. Но вы не показали, что вы на самом деле делаете. –