5

我正在使用 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 查询,但我想不出如何转换漂亮的“ROW_NUMBER() over partition SQL”。我想让它首先端到端地工作,然后让它更优雅。

我想将这个峰值投入生产并证明大约 90% 的速度。

4

1 回答 1

0

我不确定性能,但您可以使用 LINQ:

改变:

.List<DealSearch>();

至:

.List<DealSearch>().Distinct().ToList();
于 2012-01-05T15:00:32.393 回答