2010-08-30 17 views
19

Neu in der MVC.net Szene (und .net für diese Angelegenheit), aber scheint, dass ich eine breite Palette von Optionen finden, wenn eine „Liste“ mit Daten füllen will. In meinem Fall möchte ich im Moment eine Liste aus einer ausgewählten Abfrage von Elementen auffüllen und die Ergebnisse in JSON zur Ausgabe rendern, also bitte mit mir ...IEnumerable <T> VS IList <T> VS IQueryable <T>

Also meine Viewmodel-Klasse ist so etwas wie die Ausgabe in meine Liste

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

dann würde ich Schleife so dass ich dann Ausgabe in meiner Json Rückkehr string::

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

Und dann würde ich es mit meiner Anfrage Ausgabe füllen möge? Und wenn ich eine LISTE VS IENUMERABLE VS IQUERRYABLE ??

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

Antwort

32

Meine Faustregeln:

  • eine Liste verwenden, wenn Sie hinzufügen, entfernen Sie, oder durch den Index auf ein Element beziehen.

  • Verwenden Sie eine IQueryable, wenn Sie Ad-hoc-Abfragen dagegen ausführen müssen.

  • Verwenden Sie standardmäßig IEnumerable.

Es sieht aus wie Sie bereits die Abfrage „in“ Ihrer Datenbank zu tun, also würde ich die einfachste Variante schlage vor, mit: IEnumerable einfach in der Lage durch die Ergebnisse in einer Schleife sein.

+8

Eigentlich sollte, wenn möglich, das 'var' Schlüsselwort in diesem Fall verwendet werden, dann müssen Sie sich nicht darum sorgen, den Typ irgendwo zu übertragen. Ändere es einfach in 'var z = ...' ohne die 'ToList()' am Ende. Dies wird wahrscheinlich "IQueryable" behalten, aber trotzdem von IEnumerable erbt. – Jess

+8

ICollection von T beim Hinzufügen/Entfernen, IList von T (oder T []) beim Indizieren ist ebenfalls erforderlich. Die meisten Dinge kommen mit nur IEnumerable von T, und das ist großartig, in öffentlichen Schnittstellen zu entlarven. Ich benutze List selten mehr. – CRice

3

Jede Schnittstelle hat ihre eigenen Verwendungszwecke.

IQueryable ist für latente Abfragen (dh, speichert es die Abfrage aber nur führt sie aus, wenn sie aufgezählt wird)

IEnumerable aufgezählt werden können, und das ist es.

In IList können Elemente hinzugefügt und entfernt werden.

+2

IEnumerable wird auch verzögerte Ausführung. – Omar

+1

'IEnumerable' kann auch für die verzögerte Ausführung verwendet werden. Siehe zum Beispiel ['Enumerable.Reverse'] (http://msdn.microsoft.com/en-us/library/bb358497.aspx). Es wird ein 'IEnumerable ' zurückgegeben, aber die tatsächliche Umkehrung wird erst gestartet, wenn das erste Element aufgelistet wird. –

10

Wenn Sie zu .NET und C# neu sind, würde ich etwas Zeit damit verbringen, zu recherchieren und zu erfahren, was die verschiedenen Sammlungstypen sind, wie sie sich unterscheiden und wann sie zu verwenden sind. Sie werden Sammlungen so oft verwenden, dass Sie es sich nicht leisten können, einen "einfachen Ein-Liner" -Überblick zu haben, wie die anderen Beantworter gepostet haben.

Hier ist eine gute Anleitung auf .NET Sammlung Typen: http://msdn.microsoft.com/en-us/library/0ytkdh4s.aspx

IQueryable sein ganz besonderes Tier und verdient seine eigenen Führer: http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx

+0

+1 Die beste Antwort ist oft diejenige, die auf die entsprechende Quelle verweist. Vielen Dank für die Veröffentlichung des MSDN-Links !! – dotnetguy

Verwandte Themen