NHibernate использует значение из первого запроса

#nhibernate

#nhibernate

Вопрос:

Итак, у меня есть запрос типа

 public static IEnumerable<Archive> GetArchivesRecursive(this ISession session, Page rootPage)
{
    var archives = session.Query<Page>().Where(p => p != rootPage amp;amp; p.Path.StartsWith(rootPage.Path))
    .GroupBy(p => new { Year = p.Published.Year, Month = p.Published.Month })
    .Select(g => new Archive
    {
            ContextPageId = rootPage.Id,
            Year = g.Key.Year,
            Month = g.Key.Month,
            TotalPageCount = g.Count(),
            PublicPageCount = g.Count(p => p.State == PageState.Public amp;amp; p.Published <= DateTime.UtcNow)
    })
    .ToList();

    // ContextPageId has old value (id of the first rootPage used since app start)
    // Why do I have to do this?
    archives.ForEach(a => a.ContextPageId = rootPage.Id);
    return archives;
}
  

По какой-то причине свойство ContextPageId получает значение первого параметра rootPage, который был использован.

Ответ №1:

Что ж, довольно интересно, мой NH 3.2 на самом деле терпит неудачу с MismatchedTreeNodeException для еще более простых запросов при попытке получить значение из входных данных во Select внутреннем запросе. Какую версию вы используете?

В любом случае, похоже, что вы просто не можете использовать значения извне запроса в projection ( Select ), и это, вероятно, ограничение Linq NHibernate. Ваша версия, похоже, кэширует скомпилированное выражение из Select , игнорируя тот факт, что оно зависит от переменной. DateTime значение одинаково и для всех вызовов, не так ли?

Немного более чистое решение могло бы выглядеть следующим образом:

 .Select(g => new
{
    Year = g.Key.Year,
    Month = g.Key.Month,
    TotalPageCount = g.Count(),
    PublicPageCount = g.Count(p => p.State == PageState.Public amp;amp; p.Published <= DateTime.UtcNow)
})
.AsEnumerable()
.Select(g => new Archive
{
    ContextPageId = rootPage.Id,
    Year = g.Year,
    Month = g.Month,
    TotalPageCount = g.TotalPageCount,
    PublicPageCount = g.PublicPageCount
})
.ToList();
  

РЕДАКТИРОВАТЬ Я посмотрел немного внимательнее, и это действительно ошибка NHibernate, уже известная. Смотрите Это сообщение в блоге и эту запись об ошибке JIRA.

Комментарии:

1. Похоже, что новая версия 3.2.0.4000 установлена через nuget. Я думаю, мне также нужно проверить эту часть DateTime.