C# NHiBernEnter准则QueQuaseBasic在中间插入SQL
我正在使用条件来加速查询,我几乎做到了 使用“按示例查询”匹配表中的行,删除具有相同id的重复行,然后分页 当然,在删除重复的行之前,我不能分页,我不知道怎么做。它可以在SQL中完成,但是如果与流畅的代码相适应,ISQLQuery不会返回ICriteria对象C# NHiBernEnter准则QueQuaseBasic在中间插入SQL,c#,nhibernate,fluent-nhibernate,criteria-api,query-by-example,C#,Nhibernate,Fluent Nhibernate,Criteria Api,Query By Example,我正在使用条件来加速查询,我几乎做到了 使用“按示例查询”匹配表中的行,删除具有相同id的重复行,然后分页 当然,在删除重复的行之前,我不能分页,我不知道怎么做。它可以在SQL中完成,但是如果与流畅的代码相适应,ISQLQuery不会返回ICriteria对象 public IList<EntitySearch> CriteriaSearch(EntitySearch exampleEntitySearch, int startingPage, int pageSize)
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上转换漂亮的行数。我想先让它端到端工作,然后让它更优雅
我想将这一峰值投入生产,并证明~90%的速度提高。我不确定性能,但您可以使用LINQ: 更改:
.List<DealSearch>();
致:
你可以让NHibernate在你的代码中执行硬编码的SQL,但是你失去了NHibernate给你的一系列优势,比如类型安全,从类映射到DB对象的强类型,对DB引擎不可知,更复杂的SQL不会在所有的DBs上运行,延迟加载,缓存等等。我建议,除非是绝对必要的,并且您确信永远不会切换DB引擎,否则不要在NHibernate的代码中使用硬编码SQL。恐怕硬编码SQL总比没有好。进一步研究,标准不需要按照正确的顺序,我应该能够使用ExpressionSQL。我的查询是SQL的特定部分,它使用分区上的行数来获取每个子组中的第一项。这是分页之前需要的。有一个经验丰富的团队可能会在此论坛上帮助您:,请尝试使用标准的想法是在服务器上进行处理,从而减少要传输到服务器的数据。NHibernate的LINQ只有在数据交付后才能工作。SQL Server上有.NET,这是我没有想到的。明白了,我错过了在服务器端执行的部分,这非常有意义,我只是想得到一个不同的结果集。我现在没时间看,但你们有并没有看过使用distinctentityroott变压器的SetResultTransformer?
.List<DealSearch>().Distinct().ToList();