C# NHiBernEnter准则QueQuaseBasic在中间插入SQL

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)

我正在使用条件来加速查询,我几乎做到了

使用“按示例查询”匹配表中的行,删除具有相同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上转换漂亮的行数。我想先让它端到端工作,然后让它更优雅


我想将这一峰值投入生产,并证明~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();