#linq #odata
#linq #odata
Вопрос:
Если я создам эту коллекцию:
IEnumerable<_TITLE> _titles = null;
Как я могу задать результирующий набор из Netflix в этом выражении:
_titles = from t in Titles where t.Id == "ApUFq" select new {t, t.Cast}
Я получаю:
Не удается неявно преобразовать тип ‘System.Linq.IQueryable’ to’System.Коллекции.Общий.IEnumerable<_Title>’. Существует явное преобразование (вам не хватает приведения?)
Я понимаю, это потому, что я использую анонимный тип. _TITLE — это пользовательский сложный объект, который я создаю, который предоставляет подмножество свойств Netflix.
Если я добавлю «_TITLE» перед «new», это говорит о том, что мой объект не реализует IENUMBERABLE.
Если затем _TITLE реализует IENUMBERABLE, это говорит о том, что _TITLE не содержит определения для ADD и по-прежнему выдает ошибку преобразования.
В принципе, я хочу установить свойства _TITLE с данными, возвращаемыми из Netflix. Я определил _TITLE так, чтобы он содержал нужные мне поля, а также коллекцию PERSON (для приведения).
Комментарии:
1. пожалуйста, исправьте свой текст, чтобы он правильно форматировал ваш код
Ответ №1:
Если ваш универсальный тип _TITLE, то вам нужно сделать select new _TITLE {Prop = Value}
.
Если вы собираетесь использовать универсальный тип, то вам необходимо использовать var
:
var _titles = from t in Titles where t.Id == "ApUFq" select new {t, t.Cast};
Так что, возможно, это то, что вы имели в виду:
var _titles = from t in Titles where t.Id == "ApUFq" select new _TITLE {Title = t};
Что-то в этом роде. var
может использоваться, даже если вы не собираетесь использовать анонимный тип.
Ответ №2:
В дополнение к ответу vcsjones вам не нужно реализовывать IEnumerable в _TITLE . Происходит то, что когда вы пишете
var foo = new TYPENAME { a, b };
это означает:
- создайте новое имя типа, которое реализует IEnumerable
- вызовите foo.Добавьте (a), затем foo.Добавить (b);
Пример:
var names = new List<string> { "Joe", "Mary", "Susan" };
Как упоминал vcsjones, вам необходимо использовать имена параметров при инициализации объекта, или, возможно, вы хотели использовать круглые скобки и вызвать конструктор
var title = new _TITLE { Title = t.ID, Cast = t.Cast };
// or
var title = new _TITLE (t.ID, t.Cast);
Комментарии:
1. Зачем ему нужно было внедрять
IEnumerable
в _TITLE? Я думаю, что способ, которым это должно работать, заключается в том, что операционная система LINQ возвращает IEnumerable<_TITLE>. Я думаю, проблема, которая возникла, заключалась в том, что он использовал {} в качестве инициализатора коллекции, когда он намеревался использовать его в качестве инициализатора объекта.