2009-04-22 16 views

risposta

1

Non riesci a realizzare che NHibernate ti restituisce un IList? L'interfaccia ICriteria definisce un metodo di List<T> ...

+0

Sì, è possibile! Basta usare var result = Session.CreateCriteria (....). List () invece og .List(). – stiank81

+0

@ stiank81: era una domanda retorica. ;) –

+0

Beh, l'ho capito ;-) Aggiungendo solo un commento con i dettagli insieme il mio +1 in allegria dopo aver appena imparato questo da te .. – stiank81

72

Se sei sicuro che tutti gli elementi ereditano da T (o qualunque sia il tipo che si sta utilizzando)

IList<T> myList = nonGenericList.Cast<T>().ToList(); 

Se non siete sicuri :

IList<T> myList = nonGenericList.OfType<T>().ToList(); 

Naturalmente, è necessario lo spazio dei nomi System.Linq:

using System.Linq; 
2

Un modo è quello di utilizzare Linq, come list.OfType<T>() o .Cast<T>()

5

Cast e OfType ritorno IEnumerable<T> implemetnations, non IList<T> implementazioni, in modo che non sarebbe utile a voi.

Chiamata. Cast<T>().ToList genererà una copia aggiuntiva dell'elenco, che potrebbe avere implicazioni negative sulle prestazioni.

Un approccio migliore (IMHO) sarebbe semplicemente creare una classe wrapper e effettuare la conversione al volo. Si desidera qualcosa di simile:

Ciò avrà il vantaggio di non creare un'altra copia dell'intera lista.

1

Frederik è corretto, NHibernate già lo fa.

var data = query.List<MyType>(); 

Ciò comporterebbe un IList del tipo specificato. In questo caso IList<MyType>.

3

Fredrick è corretto. Ma Nhibernate ha anche un'opzione per restituire più set di risultati. Per esempio:

IList multiResults = session.CreateMultiCriteria() 
       .Add(pageCriteria) 
       .Add(countCriteria) 
       .List(); 

Nella chiamata di cui sopra non c'è un'opzione per restituire un elenco digitato. Quindi deve essere castato come detto sopra, in questo modo:

IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList(); 
      IList counts = (IList)multiResults[1];