我正在使用Criteria加快查询速度,而且我快到了。NHibernate Criteria QueryByExample坚持SQL中间
使用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%的加速。
那么你可以让NHibernate的执行中的硬编码SQL你的代码,但是你放弃了NHibernate为类型安全(从类到数据库对象的强类型输入)提供的好处,对数据库引擎是不可知的(更复杂的SQL不会在所有数据库上运行),延迟加载,缓存等。我会建议,除非绝对必要,并且您肯定不会切换数据库引擎,不要在代码中使用硬编码的SQL与NHibernate。 –
硬编码SQL比没有好,我害怕。 进一步研究,Criteria不需要按照正确的顺序进行,我应该可以使用ExpressionSQL。 我的查询是关于使用分区上的ROW_NUMBER来获取每个子分组中的第一项的SQL的特定位。分页之前需要哪个。 – zeristor
有一个经验丰富的团队可以帮助你在这个论坛上:http://sqlserver.ro,试试吧 –