2010-12-10 4 views
9

Ich erstelle eine MVC-Anwendung, die Nhibernate und Paging verwendet. Ich habe eine Eltern-Kind-Beziehung, die ich versuche, meine Kind-Datensätze zu laden. Das funktioniert alles gut.Nhibernate, eifrig Laden und Paging

Das Problem, das ich habe, ist mit dem Paging. Ich hätte gerne 15 Artikel pro Seite. Dies funktioniert perfekt, wenn jeder Elternteil nur ein Kind hat. Das Problem liegt vor, wenn ein Elternteil mehr als ein Kind hat. Wenn zum Beispiel der Elternteil zwei untergeordnete Datensätze hat, wählt die Datenbank tatsächlich 15 Datensätze aus, wobei zwei dasselbe Elternelement darstellen, eines für jedes der beiden untergeordneten Elemente. Daher scheint es in meiner Datenansicht auf der Seite, dass es nur 14 Datensätze gibt.

Weiß jemand, wie ich gehen könnte, um meine Seite zählt nur durch Eltern, während immer noch eifrig laden meine Kind-Entitäten?
Dies wird eine öffentlich zugängliche Seite sein, also denke ich nicht, dass es eine gute Idee wäre, faul zu laden, da es zu viele Fahrten zum Server verursachen wird.

Gibt es etwas in NHibernate integriert, das damit umgehen kann, dass ich vermisse?

Danke für irgendwelche Gedanken.

Antwort

0

Sie müssen für Ihre Abfrage einen eindeutigen Stammergebnis-Transformer verwenden. Sie haben nicht gesagt, ob Sie HQL oder Criteria verwenden, aber die API ist für beide ähnlich.

// criteria 
criteria.SetResultTransformer(Transformers.DistinctRootEntity) 

Dadurch wird erzwungen, dass die Ergebnismenge nur bestimmte übergeordnete Entitäten enthält.

+2

Ich benutze die unterschiedliche root-Entity, aber es zählt immer noch die mehreren untergeordneten Elemente jedes Mal, nicht nur die verschiedenen übergeordneten Elemente zählen. – czuroski

+0

@James Gregory - Ihr Vorschlag wird nicht funktionieren, da Paging normalerweise als SELECT TOP (@ p0) ausgedrückt wird .... und wenn es eifrig geladen wird, haben Sie Joins, die einige Entitäten weit unterhalb der von TOP auferlegten Grenze erscheinen lassen. –

1

Sie könnten Ihre Verknüpfungseigenschaft mit fetch="subselect" markieren - dies stellt auch sicher, dass Sie keine Probleme mit einem großen kartesischen Produkt auf Kosten von zwei Abfragen für jede Auswahl haben.

0

Die Verwendung des batch-size Hinweises in Ihrem Mapping für die Child-Sammlung ist wahrscheinlich der beste/einfachste Weg, um damit umzugehen. Für weitere Diskussion, siehe meine Antwort auf diese similar question.

+0

Mit anderen Worten schlägt diese Antwort anstelle von eager-loading das Wechseln zu Lazy-Loading mit Stapelverarbeitung bei verzögerten Ladeoperationen vor, um das N + 1-Leistungsproblem zu vermeiden. –