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.