Cou*_*ero 10 linq nhibernate group-by sql-order-by fluent-nhibernate
我试图得到一个组,然后按计数顺序工作,但我不断被抛出'Antlr.Runtime.NoViableAltException'.
这是我可以创建的最简单的错误案例.
var results = ArticleStatsRepository.GetAll().GroupBy(x => x.Article.ArticleId)
.OrderBy(x => x.Count());
Run Code Online (Sandbox Code Playgroud)
ArticleStatsRepository.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; }
}
Run Code Online (Sandbox Code Playgroud)
最终我想要执行以下查询.
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 });
Run Code Online (Sandbox Code Playgroud)
我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
正如 @mynkow 和 @Chris S 所说,这是 NH 3.1 问题。您可以更新库版本或查看有关类似问题的那些问题:
http://sourceforge.net/p/nhibernate/mailman/nhibernate-issues/
Nhibernate 3 Linq 抛出 Antlr.Runtime.NoViableAltException
| 归档时间: |
|
| 查看次数: |
2983 次 |
| 最近记录: |