NHibernate использует значение из первого запроса - PullRequest
2 голосов
/ 09 ноября 2011

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

public static IEnumerable<Archive> GetArchivesRecursive(this ISession session, Page rootPage)
{
    var archives = session.Query<Page>().Where(p => p != rootPage && 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 && 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 Ответ

0 голосов
/ 09 ноября 2011

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

В любом случае, похоже, что вы просто не можете использовать значения вне запроса в проекции (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 && 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...