NHIbernate(3.1)-Linq集团随后按订单计数问题

NHIbernate(3.1)-Linq集团随后按订单计数问题,linq,nhibernate,fluent-nhibernate,group-by,sql-order-by,Linq,Nhibernate,Fluent Nhibernate,Group By,Sql Order By,我正试图让一个组在按计数排序后工作,但我一直得到一个“Antlr.Runtime.NoViableAltException”被抛出 下面是我能创建的最简单的错误案例 var results = ArticleStatsRepository.GetAll().GroupBy(x => x.Article.ArticleId) .OrderBy(x => x.Count()); GetAll()返回ArticleStats的IQueryable publ

我正试图让一个组在按计数排序后工作,但我一直得到一个“Antlr.Runtime.NoViableAltException”被抛出

下面是我能创建的最简单的错误案例

var results = ArticleStatsRepository.GetAll().GroupBy(x => x.Article.ArticleId)
               .OrderBy(x => x.Count()); 
GetAll()返回ArticleStats的IQueryable

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();
    }
公共虚拟IQueryable GetMostPopularArticleResults(TimeSpan TimeSpan,IQueryable filteredArticles,列表类型,int take)
{
var results=ArticleStatsRepository.GetAllQueryOver()。其中(x=>x.DateTime>DateTime.Now.Add(-timeSpan));
结果=结果,其中(x=>x.ArticleStatType.IsIn(类型));
var articleIdsWithCounts=结果。选择(
Projections.Group(x=>x.Article.ArticleId),
Projections.Count(x=>x.Article.ArticleId))
.OrderBy(projects.Count(x=>x.Article.ArticleId))
.描述
.拿(拿)
.List()
.Select(x=>new{ArticleId=(int)x[0],Count=(int)x[1]});
返回articleIdsWithCounts.Join(filteredArticles,artStats=>artStats.ArticleId,articles=>articles.ArticleId,(artStats,articles)=>new MostPopularArticleResult{ArticleId=artStats.ArticleId,articletTitle=articles.Content.Title,Count=artStats.Count})
.AsQueryable();
}

正如@mynkow和@Chris S所说,这是NH 3.1的问题。您可以更新库版本或查看有关simila问题的以下问题:


我理解正确吗?你想按组中元素的数量排序吗?没错,然后我想将这些结果加入到另一个表中-然后我会做一次取整,这样我只会取回x个结果。塔康:你可以使用QueryOver,还是必须是LINQ?嗨,Psousa,我已经决定暂时使用QueryOver。这是一种痛苦,因为我希望坚持IQueryable,因为它使事情变得非常容易模仿,并且我希望避免有关数据访问层/ORM的细节滑入我的业务逻辑/服务层。这是我所拥有的。这是一个已知的bug afaik-签入(分组方式和位置不起作用,因此这可能是相关的)