NHIbernate (3.1) - группа Linq к тому времени упорядочивается по количеству проблем

Я пытаюсь получить группу, за которой следует порядок по количеству для работы, но я продолжаю получать исключение «Antlr.Runtime.NoViableAltException».

Вот простейший случай ошибки, который я могу создать.

var results = ArticleStatsRepository.GetAll().GroupBy(x => x.Article.ArticleId)
               .OrderBy(x => x.Count()); 

ArticleStatsRepository.GetAll() возвращает IQueryable of ArticleStats.

public class ArticleStats
{
    public virtual int ArticleStatsId { get; set; }
    public virtual Article Article { get; set; }
    public virtual User Viewer { get; set; }
    public virtual ArticleStatTypeEN ArticleStatType { get; set; }
    public virtual DateTime DateTime { get; set; }
}

В конечном итоге я хотел бы выполнить следующий запрос.

return ArticleStatsRepository.GetAll()
                  .Where(x => x.DateTime > DateTime.Now.Add(-timeSpan))
                  .Where(x => x.ArticleStatType == ArticleStatTypeEN.View)
                  .GroupBy(x => x.Article.ArticleId)
                  .Select(x => new { ArticleId = x.Key, Count = x.Count() })
                  .OrderByDescending(x => x.Count)
                  .Join(ArticleRepository.GetAll(), artStats => artStats.ArticleId, articles => articles.ArticleId, (artStats, articles) => new MostPopularArticleResult { ArticleId = artStats.ArticleId, ArticleTitle = articles.Content.Title, Count = artStats.Count });

Я использую Fluent NHibernate 1.2.0.712, который ссылается на NHibernate: 3.1.0.4000.

Любая помощь будет принята с благодарностью!

С Уважением

Стив

Обновление: вот как я обошел проблему. Не идеально, так как я не хотел начинать использовать HQL с его QueryOver и хотел бы везде придерживаться IQueryable.

    public virtual IQueryable<MostPopularArticleResult> GetMostPopularArticleResults(TimeSpan timeSpan, IQueryable<Article> filteredArticles, List<ArticleStatTypeEN> types, int take)
    {
        var results = ArticleStatsRepository.GetAllQueryOver().Where(x => x.DateTime > DateTime.Now.Add(-timeSpan));

        results = results.Where(x => x.ArticleStatType.IsIn(types));

        var articleIdsWithCounts = results.Select(
                    Projections.Group<ArticleStats>(x => x.Article.ArticleId),
                    Projections.Count<ArticleStats>(x => x.Article.ArticleId))
                    .OrderBy(Projections.Count<ArticleStats>(x => x.Article.ArticleId))
                    .Desc
                    .Take(take)
                    .List<object[]>()
                    .Select(x => new { ArticleId = (int)x[0], Count = (int)x[1] });

        return articleIdsWithCounts.Join(filteredArticles, artStats => artStats.ArticleId, articles => articles.ArticleId, (artStats, articles) => new MostPopularArticleResult { ArticleId = artStats.ArticleId, ArticleTitle = articles.Content.Title, Count = artStats.Count })
            .AsQueryable();
    }

person CountZero    schedule 17.05.2011    source источник
comment
Я правильно понимаю? Вы хотите упорядочить по количеству элементов в группе?   -  person Daniel Hilgarth    schedule 17.05.2011
comment
Точно, тогда я хочу объединить эти результаты с другой таблицей - затем я бы сделал дубль, чтобы получить только x количество результатов. Та   -  person CountZero    schedule 17.05.2011
comment
Можете ли вы использовать QueryOver или должен быть LINQ?   -  person psousa    schedule 18.05.2011
comment
Привет Psousa, я решил использовать QueryOver на данный момент. Это боль, так как я хотел придерживаться IQueryable, так как это позволяет очень легко издеваться над вещами, и я хотел, чтобы подробности о моем уровне доступа к данным / ORM не попадали в мою бизнес-логику / сервисный уровень. Вот что у меня есть.   -  person CountZero    schedule 18.05.2011
comment
var results = ArticleStatsRepository.GetAllQueryOver().Where(x => x.DateTime › DateTime.Now.Add(-timeSpan)); results = results.Where(x => x.ArticleStatType.IsIn(types)); var articleIdsWithCounts = results.Select( Projections.Group‹СтатистикаСтатьи›(x =› x.Статья.Id Статьи), Projections.Count‹СтатистикаСтатьи›(x =› x.Article.IdСтатьи)) .OrderBy(Projections.Count‹СтатистикаСтатьи› (x =› x.Article.ArticleId)) .Desc ...   -  person CountZero    schedule 18.05.2011
comment
На самом деле это известная ошибка — проверьте nhibernate.jira.com/secure/Dashboard.jspa (группировать по и где не работает, так что это может быть связано)   -  person Chris S    schedule 18.08.2011


Ответы (1)


Как сказали @mynkow и @Chris S, это проблема NH 3.1. Вы можете обновить версию библиотеки или посмотреть на этот вопрос о проблеме simila:

http://sourceforge.net/p/nhibernate/mailman/nhibernate-issues/< /а>

Nhibernate 3 Linq выдает Antlr.Runtime.NoViableAltException

Запрос NHibernate с использованием OfType и подзапросов

проблема миграции NHibernate 3.1 с Linq

person zeppaman    schedule 01.05.2014