2011-05-17 25 views
10

我想獲得一組通過後跟一個命令的計數工作,但我不斷收到'Antlr.Runtime.NoViableAltException'被引發。NHIbernate(3.1) - Linq組,然後通過計數問題

這是我可以創建的最簡單的錯誤情況。

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

ArticleStatsRepository.GetAll()返回一個IQueryable的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。

任何幫助將不勝感激!

問候

史蒂夫

更新:我這是怎麼傳開的問題。不完美,因爲我不想用QueryOver開始使用HQL,並希望始終堅持使用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(); 
    } 
+0

難道我理解正確嗎?你想按組中元素的數量排序? – 2011-05-17 11:32:38

+0

準確地說,那麼我想將這些結果加入到另一個表格中 - 然後我會做出一個結果,以便只返回x個結果。 Ta – CountZero 2011-05-17 12:49:38

+0

你可以使用QueryOver,還是必須是LINQ? – psousa 2011-05-18 09:15:44

回答