Включить с помощью лямбда-выражения

В строковой перегрузке Include мы указываем включить коллекцию, а затем ссылку на один уровень вниз, просто указав соответствующие свойства навигации в правильном порядке:

query.Include("Level1Collection.Level2Reference");

Но почему при использовании перегрузки Include, использующей лямбда-выражение, мы также должны использовать оператор Select, чтобы указать приведенный выше запрос:

query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference)).

Почему не работает следующее:

query.Include.(e => e.Level1Collection.Level2Reference)

Спасибо


person user702769    schedule 05.04.2012    source источник


Ответы (1)


Потому что компилятор не распознает, что контекст изменил значение свойства коллекции с коллекции на замену объектов в коллекции. И поскольку компилятор не меняется в зависимости от контекста, то и intellisense не меняется.

Когда вы передаете Include строковый оператор, он знает, что должен использовать отражение, чтобы узнать, какие свойства нужно включать в любом случае, и при компиляции не выполняется проверка типов. Базовый метод знает, что, когда он видит точку после свойства коллекции в строке, он должен анализировать свойства объектов в коллекции для следующего свойства, на которое ссылаются, а не самой коллекции (в данном случае «Level2Reference»).

Или другими словами: это волшебство. :)

person Jacob Proffitt    schedule 05.04.2012