Ваш запрос LINQ лениво оценивается и реализует только интерфейс IEnumerable<T>
(насколько я знаю), что означает, что его результаты не устанавливаются до тех пор, пока перечислитель не вызовет MoveNext
где-нибудь (как это происходит в цикле foreach
, например).
Кажется, свойство DataSource
не перечисляет свое содержимое таким образом. Он полностью ожидает реализацию IList
(или одного из нескольких других интерфейсов - см. Ниже), чтобы он мог получить доступ к элементам по индексу. Это используется внутренне элементом управления для сортировки, фильтрации и т. Д. Имея это в виду, вполне вероятно, что все установки свойства DataSource
проверяют тип объекта, чтобы увидеть, реализует ли он какой-либо из поддерживаемых интерфейсов. Поэтому я не думаю, что свойство DataSource
предназначено для работы с этим типом объекта (запрос с ленивой оценкой).
Теперь этот вызов ToList
заполняет List<T>
результатами вашего запроса; этот выполняет реализацию IList
и поэтому может использоваться как DataSource
.
Насколько я понимаю, причина DataSource
, введенная просто как object
, заключается в том, что она ожидает любой следующих интерфейсов:
IList
IListSource
(в этом случае метод IListSource.GetList
используется вместе со свойством DataMember
для предоставления данных элементу управления)
IBindingList
(который распространяет изменения в списке на элемент управления для обновлений пользовательского интерфейса)
IBindingListView
(например, BindingSource
)
Это соответствует документации MSDN .