我正在使用 Criteria 来加快查询速度,而且我快到了。
使用 Query By Example 匹配表中的行,删除具有相同 id 的重复行,然后进行分页。
当然,在删除重复的行之前,我无法进行分页,而且我不知道该怎么做。它可以在 SQL 中完成,但它确实适合流畅的代码,ISQLQuery 不返回 ICriteria 对象。
public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
{
var startRow = startingPage * pageSize;
// Query By Example.
var example = Example.Create(exampleEntitySearch)
.IgnoreCase()
.EnableLike(MatchMode.Anywhere)
.ExcludeZeroes();
var results = this.Session.CreateCriteria(typeof(EntitySearch))
.Add(example)
// select * from (SELECT ROW_NUMBER()OVER (partition by Id order by Id) As rankOrder, * FROM EntitySearch) as original where original.rankOrder = 1
.SetFirstResult(startRow)
.SetMaxResults(pageSize)
.List<DealSearch>();
return results;
}
我读过的建议是在 NHibernate 中编写 SQL 查询,但我想不出如何转换漂亮的“ROW_NUMBER() over partition SQL”。我想让它首先端到端地工作,然后让它更优雅。
我想将这个峰值投入生产并证明大约 90% 的速度。