Как уже упоминалось в предыдущем ответе, раскрытие IQueryable дает абонентам доступ к игре с самим IQueryable, что является или может стать опасным.
Первой обязанностью инкапсуляции бизнес-логики является поддержание целостности вашей базы данных.
Вы можете продолжить выставлять IList и можете изменить ваши параметры следующим образом, вот как мы делаем ...
public interface ILocationRepository
{
IList<Location> FindAll(int start, int size);
IList<Location> FindForState(State state, int start, int size);
IList<Location> FindForPostCode(string postCode, int start, int size);
}
если размер == -1, вернуть все ...
Альтернативный способ ...
Если вы все еще хотите вернуть IQueryable, вы можете вернуть IQueryable из List внутри своих функций ... например ...
public class MyRepository
{
IQueryable<Location> FindAll()
{
List<Location> myLocations = ....;
return myLocations.AsQueryable<Location>;
// here Query can only be applied on this
// subset, not directly to the database
}
}
Первый метод имеет преимущество перед памятью, потому что вы будете возвращать меньше данных вместо всех.