2009-04-21 7 views
2

Ce qui suit est une simplification de mon domaine de problème. Nous avons une série de Trades, qui obtient chacun un record en Évaluations tous les jours ouvrables.NHibernate fluide exécute des sélections sur une seule ligne sur des milliers d'objets à lier aux parents

Nous filtrons nos Valorisations Liste utilisé pour un jour, mais pour alimenter le commerce contre chacune des évaluation lignes, NHibernate feux seule rangée sélectionne les métiers tables pour environ 50k lignes dans la tableau d'évaluation. Comment puis-je changer cela afin que NHibernate fasse une sélection unique sur la table des négociations?

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

Répondre

0

Vous devriez également regarder la récupération par lots. Ceci est cité de la Nhib manual - en fait le cache de Google comme le site semble être en baisse pour l'entretien atm:

Imaginez que vous avez la situation suivante lors de l'exécution: Vous avez 25 instances de Cat chargés dans un ISession, chaque Cat a une référence à son propriétaire, une personne . La classe Person est mappée avec un proxy, paresseux = "true". Si maintenant vous parcourir tous les chats et obtenir le propriétaire de chaque, NHibernate par par défaut exécuter 25 instructions SELECT, pour récupérer les propriétaires mandatés. Vous pouvez régler ce comportement en spécifiant un lot de taille dans la cartographie de la personne:

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

NHibernate exécutera désormais trois requêtes , respectivement 10, 10, 5. Vous peut voir que la récupération par lots est un aveugle deviner, dans la mesure où l'optimisation des performances va, il dépend du nombre de proxies unitisés dans un ISession particulier .

Questions connexes