Как использовать анонимные типы с Netflix OData API

#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 };
  

это означает:

  1. создайте новое имя типа, которое реализует IEnumerable
  2. вызовите 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>. Я думаю, проблема, которая возникла, заключалась в том, что он использовал {} в качестве инициализатора коллекции, когда он намеревался использовать его в качестве инициализатора объекта.