2010-09-17 10 views
1

J'ai une entité appelée Incident et une DTO appelée IncidentDTO. Pour l'instant, IncidentDTO ressemble simplement ceci:Comment empêcher AutoMapper de créer deux instructions SELECT identiques avec NHibernate?

public class IncidentDTO : Incident 
{ 
    // empty until I can get AutoMapper working correctly 
} 

Je suis en train de tirer une liste de tous les Incidents dans la base de données et les convertir en DTO en utilisant ce code:

Mapper.CreateMap<Incident, IncidentDTO>(); 

using (var session = SessionFactory.OpenSession()) 
{ 
    var incidents = session.Linq<Incident>(); 
    var incidentDTOs = Mapper.Map(incidents, new List<IncidentDTO>()); 
} 

Ce code fonctionne bien, sauf quand j'utilise NHProf pour regarder les instructions SQL générées, je reçois ceci:

SELECT ... FROM [Incident] this_ 
SELECT ... FROM [Incident] this_ 

les deux instructions SELECT sont exactement identiques. Pourquoi AutoMapper génère-t-il deux instructions SELECT identiques et comment puis-je l'empêcher de le faire?

Répondre

1

Une estimation: Énumération IQueryable crée une sélection distincte pour chaque élément. Résolvez-le en énumérant IList.

var incidents = session.Linq<Incident>().ToList(); 

Je ferais probablement cela pour éviter un autre problème.

int someReasonableNumber = 1000; 
var incidents = session.Linq<Incident>().Take(someReasonableNumber).ToList(); 

Ceci est juste une supposition, pas quelque chose que je sais vraiment.

+0

Ça l'a fait, merci! Je n'ai pas envisagé d'énumérer l'interrogeable en premier. Quant à l'ensemble non consolidé, ce n'est pas un problème car je ne prévois pas que le nombre d'incidents dépasse 200. –

0

Je pense que votre problème est lié à cette issue:

+0

Malheureusement, ce n'est pas un problème SELECT N + 1. L'Incident n'est associé à rien d'autre. –