Разница в том, что IList<T>
представляет фактический список результатов. Он будет «материализован» - извлечен из базы данных в память. (Теоретически это просто интерфейс, конечно - он может все еще отложить ...)
IQueryable<T>
представляет запрос - например, вы все еще можете создавать дополнительные биты запроса. Затем вы можете оценить запрос, запросив результаты. Это будет использовать отложенное выполнение, запрашивая результаты только тогда, когда они действительно нужны.
Что касается того, что вы должны вернуть ... если вы просто собираетесь связать напрямую с пользовательским интерфейсом, вполне может иметь смысл преобразовать его в список, чтобы вы могли лучше контролировать, когда запрос фактически выполняется , С другой стороны, если вы хотите настроить запрос, использование IQueryable<T>
даст вызывающей стороне большую гибкость.