5

我正在使用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%的加速。

+0

那么你可以让NHibernate的执行中的硬编码SQL你的代码,但是你放弃了NHibernate为类型安全(从类到数据库对象的强类型输入)提供的好处,对数据库引擎是不可知的(更复杂的SQL不会在所有数据库上运行),延迟加载,缓存等。我会建议,除非绝对必要,并且您肯定不会切换数据库引擎,不要在代码中使用硬编码的SQL与NHibernate。 –

+0

硬编码SQL比没有好,我害怕。 进一步研究,Criteria不需要按照正确的顺序进行,我应该可以使用ExpressionSQL。 我的查询是关于使用分区上的ROW_NUMBER来获取每个子分组中的第一项的SQL的特定位。分页之前需要哪个。 – zeristor

+0

有一个经验丰富的团队可以帮助你在这个论坛上:http://sqlserver.ro,试试吧 –

回答

0

我不知道性能,但你可以使用LINQ:

变化:

.List<DealSearch>(); 

要:

.List<DealSearch>().Distinct().ToList(); 
+0

使用Criteria的想法是在服务器上进行处理,因此减少要传输到服务器的数据。 对于NHibernate的LINQ只能在数据交付后才能使用。 尽管SQL Server上有.NET,但我还没有想过。 – zeristor

+0

Got ya',我错过了关于做服务器端的部分(这非常合理),我只是想要获得一个独特的结果集。我现在没有时间查看,但是您是否使用DistinctEntityRootTransformer查看了SetResultTransformer? –