Avatar ·

IEnumerable<T> oder IQueryable<T> in C# zurückgeben: Was ist der Unterschied und was soll man wählen?

Hallo zusammen! Ich bin ein C#-Anfänger, arbeite mit Entity Framework und LINQ. Oft sehe ich im Code meiner Kollegen, dass sie aus Methoden mal `IEnumerable`, mal `IQueryable` zurückgeben. Zuerst dachte ich, das sei austauschbar, aber dann bemerkte ich ein seltsames Verhalten. Hier ist ein Beispiel. Ich habe eine Methode, die eine Liste von Bestellungen abruft: ```csharp public IEnumerable GetOrders() { using (var db = new MyDbContext()) { return db.Orders.Where(o => o.IsActive); } } ``` Dann rufe ich sie auf und wende eine zusätzliche Filterung an: ```csharp var orders = GetOrders().Where(o => o.Total > 100).ToList(); ``` Ich erwartete, dass eine einzige SQL-Abfrage mit zwei Bedingungen (`IsActive = true AND Total > 100`) an die Datenbank gesendet wird, aber der Profiler zeigt, dass zuerst alle aktiven Bestellungen abgerufen werden und die Filterung nach `Total` dann im Arbeitsspeicher der Anwendung erfolgt! Das ist extrem langsam, wenn es viele Bestellungen gibt. Wenn ich jedoch den Rückgabetyp auf `IQueryable` ändere, funktioniert alles wie erwartet – in SQL wird eine einzige Abfrage generiert.