我正在使用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查询,但我想不出如何在分区SQL上转换漂亮的“ROW_NUMBER()”。我想让它首先结束,然后让它更优雅。
我希望将这个峰值投入生产并证明速度提高了约90%。
答案 0 :(得分:0)
我不确定性能,但你可以使用LINQ:
变化:
.List<DealSearch>();
要:
.List<DealSearch>().Distinct().ToList();