2011-05-17 8 views
10

Estoy tratando de obtener un grupo seguido de una orden por conteo para trabajar, pero sigo obteniendo una 'Antlr.Runtime.NoViableAltException' lanzada.NHIbernate (3.1) - Grupo Linq para entonces orden por número de cuenta

Aquí está el caso de error más simple que puedo crear.

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

ArticleStatsRepository.GetAll() devuelve un IQueryable de 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; } 
} 

En última instancia me gustaría que la siguiente consulta a ejecutar.

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 }); 

estoy usando NHibernate Fluido 1.2.0.712 que hace referencia a NHibernate: 3.1.0.4000.

¡Cualquier ayuda sería muy apreciada!

Saludos

Steve

Actualización: Esta es la forma en que me dieron la vuelta al tema. No es perfecto, ya que no quería comenzar a usar HQL con su QueryOver y me gustaría seguir con IQueryable en todo momento.

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

No he entendido bien? ¿Quieres ordenar por la cantidad de elementos en el grupo? –

+0

Exactamente, entonces quiero unir esos resultados a otra tabla - Haría una toma entonces solo retrocederé x cantidad de resultados. Ta – CountZero

+0

¿Se puede usar QueryOver o tiene que ser LINQ? – psousa

Respuesta