LINQ Лямбда-запрос 'select' не работает с oData - PullRequest
6 голосов
/ 15 марта 2012

В настоящее время я пытаюсь понять некоторые основы LINQ.Я использовал LINQPad для запроса источника ODf Netflix.

Источник: http://odata.netflix.com/v2/Catalog/

Мне не удается выбрать отдельные свойствапри использовании лямбда-запроса - запрос на понимание работает отлично.Я нашел фрагмент кода, который выполняет более сложный запрос с использованием лямбда-выражений в источнике odata Netflix, и это, кажется, работает нормально для возврата одного свойства объекта.

// works fine
var compQuery = from t in Titles
                where t.ReleaseYear == 2007
                select new { t.Name };
compQuery.Dump();   



// fails: "Can only specify query options (orderby, where, take, skip) after last navigation."
var lambdaQuery = Titles
            .Where(t => t.ReleaseYear == 2007)
            .Select(t => t.Name);

lambdaQuery.Dump(); 


// works fine - found on SO.
var lambdaQuery2 = People
    .Expand("TitlesActedIn")
    .Where(p => p.Name == "George Lucas")
    .First()
    .TitlesActedIn.Select(t => t.ShortName);              

lambdaQuery2.Dump(); 

Может ли кто-нибудь сбросить некоторые данныеЛегко понять, почему основной лямбда-запрос не выполняется, когда его просят вернуть одно свойство?

Ответы [ 3 ]

13 голосов
/ 15 марта 2012

OData не поддерживает проекцию на свойства - вы можете обойти это, хотя:

var lambdaQuery = Titles
            .Where(t => t.ReleaseYear == 2007)
            .Select(x=> new { x.Name })
            .AsEnumerable()
            .Select(t => t.Name);

Использование AsEnumerable() заставляет последнюю часть запроса выполняться в контексте Linq-to-Objects (вместо запроса OData), где проекция работает просто отлично.

6 голосов
/ 15 марта 2012

Попробуйте это - это то, что на самом деле эквивалентно вашему первому:

// fails: "Can only specify query options (orderby, where, take, skip) after last navigation."
var lambdaQuery = Titles
            .Where(t => t.ReleaseYear == 2007)
            .Select(t => new { t.Name });

lambdaQuery.Dump(); 
0 голосов
/ 15 марта 2012

Используя полученные ответы, я провел несколько тестов и обнаружил некоторые интересные вещи относительно времени выполнения:

// Avg Execution Time: 5 seconds
var query1 = Titles
            .Where(t => t.ReleaseYear == 2007)
            .Select(t => new {t.Name});     
query1.Dump();


// Avg Execution Time: 15 seconds
var query2 = Titles
            .Where(t => t.ReleaseYear == 2007)
            .AsEnumerable()
            .Select(t => t.Name);       
query2.Dump();

Итак, правильно ли я считаю, что в запросе 1 возвращается только свойство «Имя»? Принимая во внимание, что в запросе 2 метод AsEnumerable () возвращает объект со всеми значениями свойств, следовательно, более длительное время выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...