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();
}
No he entendido bien? ¿Quieres ordenar por la cantidad de elementos en el grupo? –
Exactamente, entonces quiero unir esos resultados a otra tabla - Haría una toma entonces solo retrocederé x cantidad de resultados. Ta – CountZero
¿Se puede usar QueryOver o tiene que ser LINQ? – psousa