2009-08-21 13 views
5

Mam dwa bardzo podobne metody:Dlaczego moje polecenie LINQ zwraca wartość IEnumerable?

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

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

Górny jeden, nie skompiluje, mówiąc, że zwraca IEnumerable zamiast IQueryable.

Dlaczego tak jest?

Również jestem świadomy mogę dodać „AsQueryable()” na końcu i będzie działać. Jaką to jednak robi różnicę? Jakieś wyniki skuteczności? Rozumiem, że IQueryable odroczył wykonanie i takie, czy nadal będę otrzymywać tę korzyść?

Odpowiedz

17

Enumerable.Where trwa Func<T, bool>.

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

Dzwonisz pod numer Func<T, bool>, dlatego tylko wywołanie Enumerable.Where jest odpowiednie i zwraca IEnumerable<T>.

Zmień swoją metodę:

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

i powinno być w porządku. Zasadniczo chcesz przekazać w drzewie wyrażenia zamiast delegata, aby wyrażenie można przekonwertować na SQL.

+0

Miła pani Skeet, dzięki. – qui

Powiązane problemy