2009-08-21 13 views
5

Ich habe zwei sehr ähnliche Methoden:Warum gibt meine LINQ-Anweisung IEnumerable zurück?

public IQueryable<User> Find(Func<User, bool> exp) 
{ 
    return db.Users.Where(exp); 
} 

public IQueryable<User> All() 
{ 
    return db.Users.Where(x => !x.deleted); 
} 

Die obere, kompiliert nicht, vielmehr IEnumerable kehrt als IQueryable sagen.

Warum ist das?

Auch ich bin mir bewusst, ich kann "AsQueryable()" am Ende hinzufügen und es wird funktionieren. Welchen Unterschied macht das? Jede Leistung trifft? Ich verstehe, dass IQueryable die Ausführung aufgeschoben hat, und werde ich diesen Vorteil noch erhalten?

Antwort

17

Enumerable.Where dauert Func<T, bool>.

Queryable.Where dauert Expression<Func<T, bool>>.

Sie rufen Where mit einer Func<T, bool>, daher nur die Enumerable.Where Anruf gilt, und das IEnumerable<T> zurückgibt.

Ihre Methode ändern:

public IQueryable<User> Find(Expression<Func<User, bool>> exp) 
{ 
    return db.Users.Where(exp); 
} 

und es sollte in Ordnung sein. Grundsätzlich möchten Sie anstelle eines Delegaten einen Ausdrucksbaum übergeben, damit der Ausdruck in SQL konvertiert werden kann.

+0

Schön ein Mr Skeet, danke. – qui

Verwandte Themen