2009-04-22 8 views

Respuesta

1

¿No puede lograr que NHibernate le devuelva una IList? La interfaz ICriteria define un método List<T> ...

+0

Sí, puedes! Simplemente use var result = Session.CreateCriteria (....). List () en vez og .List(). – stiank81

+0

@ stiank81: fue una pregunta retórica. ;) –

+0

Bueno, entendí eso ;-) Solo agregué un comentario con los detalles juntos mi +1 en alegría después de solo aprender esto de usted .. – stiank81

72

Si está seguro de que todos los elementos heredan de T (o cualquiera que sea el tipo que está utilizando)

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

Si no está seguro :

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

Por supuesto, necesitará el espacio de nombres System.Linq:

using System.Linq; 
2

Una forma es utilizar LINQ, como list.OfType<T>() o .Cast<T>()

5

Cast y OfType retorno IEnumerable<T> implemetnations, no IList<T> implementaciones, por lo que no sería útil para usted.

Llamando. Cast<T>().ToList dará como resultado una copia adicional de la lista, que puede tener implicaciones de rendimiento adversas.

Un mejor enfoque (IMHO) sería simplemente crear una clase contenedora y hacer la conversión sobre la marcha. Desea algo como esto:

class ListWrapper<T> : IList<T> 
{ 
    private IList m_wrapped; 

    //implement all the IList<T> methods ontop of m_wrapped, doing casts 
    //or throwing not supported exceptions where appropriate. 
    //You can implement 'GetEnumerator()' using iterators. See the docs for 
    //yield return for details 
} 

Eso tendrá la ventaja de no crear otra copia de la lista completa.

1

Frederik es correcto, NHibernate ya lo hace.

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

Esto daría como resultado un IList del tipo que ha especificado. En este caso IList<MyType>.

3

Fredrick es correcto. Pero Nhibernate también tiene una opción para devolver múltiples conjuntos de resultados. Por ejemplo:

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

En la llamada anterior no es una opción para devolver una lista escrita a máquina. Por lo tanto, tiene que ser emitido como se mencionó anteriormente, así:

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