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;
    }

คำแนะนำที่ฉันได้อ่านคือการเขียนแบบสอบถาม SQL ใน NHibernate แต่ฉันคิดไม่ออกว่าจะแปลง "ROW_NUMBER() ที่ดีเหนือพาร์ติชัน SQL" ได้อย่างไร ฉันอยากให้มันทำงานจนจบก่อนแล้วจึงทำให้มันดูหรูหรายิ่งขึ้น

ฉันต้องการให้การผลิตเพิ่มขึ้นอย่างรวดเร็วและพิสูจน์ความเร็วที่เพิ่มขึ้น ~90%


person zeristor    schedule 04.11.2011    source แหล่งที่มา
comment
คุณสามารถทำให้ NHibernate รัน SQL แบบฮาร์ดโค้ดในโค้ดของคุณ แต่จากนั้นคุณก็สูญเสียข้อดีมากมายที่ NHibernate มอบให้คุณเช่นความปลอดภัยประเภท (การพิมพ์ที่แข็งแกร่งจากแผนที่ของคลาสไปยังวัตถุ DB) โดยไม่เชื่อเรื่องกลไก DB (เพิ่มเติม SQL ที่ซับซ้อนจะไม่ทำงานบนฐานข้อมูลทั้งหมด), การโหลดแบบ Lazy Loading, การแคช ฯลฯ ฉันขอแนะนำ เว้นเสียแต่ว่าจำเป็นจริงๆ และคุณแน่ใจว่าคุณจะไม่เปลี่ยนกลไก DB อย่าใช้ SQL แบบฮาร์ดโค้ดในโค้ดกับ NHibernate   -  person Jesse Webb    schedule 04.11.2011
comment
ฉันเกรงว่า SQL แบบฮาร์ดโค้ดนั้นดีกว่าไม่มีอะไรเลย จากการค้นคว้าเพิ่มเติม เกณฑ์ไม่จำเป็นต้องอยู่ในลำดับที่ถูกต้อง และฉันควรจะสามารถใช้ ExpressionSQL ได้ แบบสอบถามของฉันลงไปถึงบิตเฉพาะของ SQL ซึ่งใช้ ROW_NUMBER บนพาร์ติชันเพื่อรับรายการแรกในแต่ละกลุ่มย่อย ซึ่งจำเป็นก่อนการแบ่งหน้า   -  person zeristor    schedule 07.11.2011
comment
มีทีมงานที่มีประสบการณ์ที่อาจช่วยเหลือคุณในฟอรัมนี้: sqlserver.ro ลองที่นั่น   -  person radu florescu    schedule 24.12.2011


คำตอบ (1)


ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพ แต่คุณสามารถใช้ LINQ ได้:

เปลี่ยน:

.List<DealSearch>();

To:

.List<DealSearch>().Distinct().ToList();
person BaTTy.Koda    schedule 05.01.2012
comment
แนวคิดในการใช้ Criteria คือการประมวลผลบนเซิร์ฟเวอร์ และลดข้อมูลที่จะถ่ายโอนไปยังเซิร์ฟเวอร์ LINQ สำหรับ NHibernate จะทำงานหลังจากส่งข้อมูลแล้วเท่านั้น มี. NET บน SQL Server ซึ่งเป็นสิ่งที่ฉันยังไม่ได้คิด - person zeristor; 06.01.2012
comment
เข้าใจแล้ว ฉันพลาดส่วนที่เกี่ยวกับการทำฝั่งเซิร์ฟเวอร์ (ซึ่งสมเหตุสมผลดี) ฉันแค่มองหาชุดผลลัพธ์ที่แตกต่างออกไป ฉันไม่มีเวลาดูตอนนี้ แต่คุณได้ดู SetResultTransformer โดยใช้ DistinctEntityRootTransformer แล้วหรือยัง? - person BaTTy.Koda; 06.01.2012