5

Bir sorguyu hızlandırmak için Kriter kullanıyorum ve neredeyse varım.NHibernate Kriterleri QueryByExample Orta 0'da SQL'de sıkışmış

Tablodaki satırları eşleştirmek için Örnekle Sorguyu Kullanarak, yinelenen satırları aynı kimliğe sahip olarak kaldırın ve ardından sayfalara ayırın.

Yinelenen satırları kaldırana kadar tablomlamıyorum ve bunu nasıl yapacağımı bilmiyorum. SQL'de yapılabilir, ancak akıcı kod ile uyumludur, ISQLQuery bir ICriteria nesnesi döndürmez. Okuduğum

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

Önerileri NHibernate SQL sorgusu yazmaya, ama şık "bölümü SQL üzerinde ROW_NUMBER()" dönüştürmek için nasıl düşünemiyorum. İlk önce sonuna kadar çalışmak, daha zarif yapmak istiyorum.

Bu spike'ı üretime almak ve ~% 90'lık hızı kanıtlamak istiyorum.

Değişim:

.List<DealSearch>(); 

için: LINQ

+0

Iyi NHibernate içinde kodlanmış SQL çalıştırmak yapabilirsiniz senin kod ama sonra NHibernate size DB motoru için agnostik olmak (daha karmaşık SQL tüm DB'lerde çalışmayacak) tip-güvenlik (DB nesnelerinin sınıf haritasından güçlü yazarak) gibi avantajlar sağlar. yavaş yüklenme, önbelleğe alma, vb. Kesinlikle gerekli ve kesinlikle DB motorları değiştirmeyecek, NHibernate ile kodda kodlanmış SQL kullanmayın emin olacağım. –

+0

Sabit kodlanmış SQL, hiçbir şeyden daha iyidir, korkarım. Daha fazla araştırmak için Kriterlerin doğru sırada olmaları gerekmez ve ExpressionSQL'i kullanabilmem gerekir. Sorgu, her alt gruptaki ilk öğeyi almak için ROW_NUMBER bölümünü bölümün üzerinde kullanan belirli SQL bitine inmiştir. Sayfalamadan önce gerekli olan. – zeristor

+0

Bu forumda size yardımcı olabilecek deneyimli bir ekip var: http://sqlserver.ro, orada deneyin –

cevap

0

ben performansı hakkında emin değilim, ama kullanabilirsiniz

.List<DealSearch>().Distinct().ToList(); 
+0

Ölçüt kullanma fikri sunucu üzerinde işlem yapmak ve böylece sunucuya aktarılacak verileri azaltmaktır . NHibernate için LINQ, yalnızca veri teslim edildikten sonra çalışır. SQL Server'da .NET var, düşünmediğim bir şey var. – zeristor

+0

Anladım, sunucu tarafında yapmayla ilgili kısmı özledim (ki bu mükemmel bir anlam ifade ediyor), sadece farklı bir sonuç elde etmeye çalışıyordum. Şu an bakmaya vaktim yok, ama DistinctEntityRootTransformer kullanarak SetResultTransformer'a baktınız mı? –