2010-08-30 33 views
19

nuevo en la escena MVC.net (y .net para el caso), pero parece que encuentro una amplia gama de opciones cuando se quiere rellenar una "lista" con los datos. En mi caso en este momento, me gustaría llenar una lista de una consulta de selección de elementos y presentar los resultados en JSON para su salida, así que tengan paciencia ...IEnumerable <T> VS VS IList <T> IQueryable <T>

Entonces, mi clase viewmodel es algo así como :

[Serializable()] 
public class TFSquery 
{ 
    public int MsgUid { get; set; } 
    public DateTime CreateStamp { get; set; }  
} 

Y entonces me gustaría llenarla con mi salida de la consulta:

List<TFSquery> z = (from msg in _DB.Msg 
        select new { msg.MsgUID, msg.CreateStamp }).ToList(); 

entonces yo bucle de la salida a mi Lista de modo que pueda entonces la salida en mi cadena de retorno JSON? Y cuando uso un LISTA VS IENUMERABLE VS IQUERYABLE ??

return Json(new { Result = z }, JsonRequestBehavior.AllowGet);  

Respuesta

32

Mis reglas de oro:

  • utilizar una lista cuando se tiene que añadir, eliminar o hacer referencia a un elemento por el índice.

  • Utilice IQueryable cuando tenga que ejecutar consultas ad-hoc en su contra.

  • Use IEnumerable de forma predeterminada.

Parece que ya está haciendo la consulta "en" su base de datos, por lo que te recomendamos que utilices la versión más simple: IEnumerable simplemente ser capaz de recorrer los resultados.

+8

En realidad, si es posible, la palabra clave 'var' se debe usar en este caso, entonces no tiene que preocuparse por enviar el tipo a ninguna parte. Simplemente cámbialo a 'var z = ...' sin el 'ToList()' al final. Esto probablemente lo mantendrá 'IQueryable', pero que hereda de' IEnumerable' de todos modos. – Jess

+8

ICollection de T al agregar/eliminar, IList de T (o T []) cuando también se requiere indexación. La mayoría de las cosas salen bien con solo IEnumerable of T, y esto es ideal para exponer en interfaces públicas. Raramente uso List más. – CRice

3

Cada interfaz tiene su propio conjunto de usos.

IQueryable es para consultas diferidos (es decir, se ahorra la consulta pero sólo se ejecuta cuando se enumera)

IEnumerable se pueden enumerar y eso es todo.

IList puede tener elementos añadidos y eliminados.

+2

IEnumerable también se aplaza. – Omar

+1

'IEnumerable' también se puede utilizar para la ejecución diferida. Por ejemplo, vea ['Enumerable.Reverse'] (http://msdn.microsoft.com/en-us/library/bb358497.aspx). Devuelve un 'IEnumerable ', pero la inversión real no se inicia hasta que se enumera el primer elemento. –

10

Si eres nuevo en .NET y C# Me gustaría dedicar un tiempo a investigar y conocer los diferentes tipos de colecciones, cómo difieren y cuándo utilizarlas. Utilizará las colecciones con tanta frecuencia que no puede permitirse tener un resumen de "líneas simples" como los otros contadores publicados.

Aquí es una buena guía sobre los tipos de recolección de .NET: http://msdn.microsoft.com/en-us/library/0ytkdh4s.aspx

IQueryable es su propia bestia especial y merece su propia guía: la ejecución http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx

+0

+1 La mejor respuesta suele ser la que dirige a la fuente apropiada. ¡Gracias por publicar el enlace de MSDN! – dotnetguy