Kriteria NHibernate QueryByExample terjebak dengan SQL di tengah

Saya menggunakan Kriteria untuk mempercepat kueri, dan saya hampir sampai.

Menggunakan Kueri Berdasarkan Contoh untuk mencocokkan baris dalam tabel, menghapus baris duplikat dengan id yang sama, lalu membuat paginasi.

Tentu saja saya tidak dapat membuat halaman sampai saya menghapus baris duplikat, dan saya tidak tahu bagaimana melakukannya. Itu bisa dilakukan dalam SQL, tapi itu sesuai dengan kode yang lancar, ISQLQuery tidak mengembalikan objek 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;
    }

Saran yang saya baca adalah menulis kueri SQL di NHibernate, tapi saya tidak bisa memikirkan cara mengonversi "ROW_NUMBER() yang bagus melalui partisi SQL". Saya ingin membuatnya berfungsi secara menyeluruh terlebih dahulu, kemudian membuatnya lebih elegan.

Saya ingin lonjakan produksi ini dan membuktikan kecepatan ~90%.


person zeristor    schedule 04.11.2011    source sumber
comment
Anda dapat membuat NHibernate mengeksekusi SQL yang dikodekan dengan keras dalam kode Anda, tetapi kemudian Anda kehilangan banyak keuntungan yang diberikan NHibernate kepada Anda seperti keamanan tipe (pengetikan yang kuat dari peta kelas ke objek DB), menjadi agnostik terhadap mesin DB (lebih lanjut SQL yang rumit tidak akan berjalan di semua DB), pemuatan lambat, caching, dll. Saya akan merekomendasikan, kecuali benar-benar diperlukan dan Anda yakin tidak akan pernah mengganti mesin DB, jangan gunakan SQL hard-coded dalam kode dengan NHibernate.   -  person Jesse Webb    schedule 04.11.2011
comment
Saya khawatir, SQL dengan kode keras lebih baik daripada tidak sama sekali. Meneliti lebih lanjut, Kriteria tidak harus berada dalam urutan yang benar, dan saya harus bisa menggunakan ExpressionSQL. Permintaan saya turun ke bagian spesifik SQL yang menggunakan ROW_NUMBER pada partisi untuk mengambil item pertama di setiap subkelompok. Yang diperlukan sebelum pagination.   -  person zeristor    schedule 07.11.2011
comment
Ada tim berpengalaman yang mungkin bisa membantu Anda di forum ini: sqlserver.ro, coba di sana   -  person radu florescu    schedule 24.12.2011


Jawaban (1)


Saya tidak yakin dengan kinerjanya, tetapi Anda bisa menggunakan LINQ:

Mengubah:

.List<DealSearch>();

To:

.List<DealSearch>().Distinct().ToList();
person BaTTy.Koda    schedule 05.01.2012
comment
Ide penggunaan Kriteria adalah untuk melakukan pemrosesan di server, sehingga mengurangi data yang akan ditransfer ke server. LINQ untuk NHibernate hanya akan berfungsi setelah data dikirimkan. Ada .NET di SQL Server, sesuatu yang belum saya pikirkan. - person zeristor; 06.01.2012
comment
Mengerti, saya melewatkan bagian tentang melakukannya di sisi server (yang sangat masuk akal), saya hanya ingin mendapatkan kumpulan hasil yang berbeda. Saya tidak punya waktu untuk melihatnya sekarang, tetapi apakah Anda sudah melihat SetResultTransformer menggunakan DistinctEntityRootTransformer? - person BaTTy.Koda; 06.01.2012