2009-04-21 3 views
2

Das folgende ist eine Vereinfachung meiner Problemdomäne. Wir haben eine Reihe von Trades, die jeder einen Eintrag in Bewertungen jeden Werktag bekommt.Fluent NHibernate führt Einzelreihenauswahl für Tausende von Objekten aus, um eine Verknüpfung zu Eltern herzustellen

Wir filtern unsere Die Bewertungen Liste für einen bestimmten Tag verwendet, aber die Handels gegen jeden der Valuation Reihen aufzufüllen, feuert NHibernate einreihig auf den rund 50k Zeilen in der Trades Tabelle auswählt Bewertungstabelle. Wie kann ich dies ändern, so dass NHibernate eine einzelne Auswahl in der Handelstabelle vornimmt?

CREATE TABLE Trades 
( TradeId   INT 
, InstrumentType VARCHAR(20) 
, TradeDate  DATETIME 

, PRIMARY KEY 
( TradeId) ) 

CREATE TABLE Valuations 
( TradeId   INT 
, ValueDate  DATETIME 
, PresentValue NUMERIC(12,4) 

, PRIMARY KEY 
( TradeId 
, ValueDate ) ) 

.

class Trade 
{ 
    public int TradeId; 
    public string InstrumentType; 
    public DateTime TradeDate; 
} 

class Valuation 
{ 
    public int TradeId; 
    public DateTime ValueDate; 
    public double PresentValue; 
    public Trade Trade; 
} 

.

class ValuationMap : ClassMap<Valuation> 
{ 
    public ValuationMap() 
    { 
     WithTable("Valuations"); 
     UseCompositeId() 
      .WithKeyProperty(x => x.ValueDate) 
      .WithKeyProperty(x => x.TradeId); 

     Map(x => x.PresentValue); 

     References(x => x.Trade, "TradeId") 
      .LazyLoad() 
      .Cascade.None() 
      .NotFound.Ignore() 
      .FetchType.Join(); 
    } 
} 

class TradeMap : ClassMap<Trade> 
{ 
    public TradeMap() 
    { 
     WithTable("Trades"); 

     Id(x => x.TradeId); 

     Map(x => x.InstrumentType); 
     Map(x => x.TradeDate); 
     Map(x => x.Valuations); 
    } 
} 

.

public List<Valuation> GetValuations(DateTime valueDate) 
{ 
    return (from p in _nhibernateSession.Linq<Valuation>() 
      where p.ValueDate == valueDate 
      select p).ToList(); 
} 

Antwort

0

Sie sollten auch Batch-Abruf betrachten. Dies wird von der Nhib manual zitiert - tatsächlich Google-Cache als Standort für Wartungsarbeiten heruntergefahren atm zu sein scheint:

Stellen Sie sich vor Sie haben die folgende Situation zur Laufzeit: Sie haben 25 Cat Instanzen in einem ISession geladen, die jeweils Katze hat einen Hinweis auf ihren Besitzer, eine Person. Die Person-Klasse ist mit einem Proxy zugeordnet, Lazy = "True". Wenn Sie nun durchlaufen alle Katzen und erhalten Sie die Besitzer von jedem, wird NHibernate von standardmäßig ausführen 25 SELECT-Anweisungen, , um die Proxy-Besitzer abzurufen. Sie abstimmen kann dieses Verhalten durch eine Batch-Größe in der Abbildung von Person festgelegt wird:

<class name="Person" lazy="true" batch-size="10">...</class> 

NHibernate wird nun nur drei Abfragen ausführen, wird das Muster 10, 10, 5. Sie kann sehen, dass Batch-Abruf ist ein Blind rate, soweit Leistung Optimierung geht, es hängt von der Anzahl der unitinisierten Proxies in einer insbesondere ISession.

Verwandte Themen