#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.