LINQ лямбда-запрос "select" не работает с oData
в настоящее время я пытаюсь понять некоторые основы с LINQ. Я использую LINQPad для запроса источника OData Netflix.
источник: http://odata.netflix.com/v2/Catalog/
Я не могу выбрать отдельные свойства при использовании лямбда-запроса - Запрос понимания работает отлично. Я нашел фрагмент кода, который выполняет более сложный запрос с использованием lambdas в источнике Netflix oData, и это кажется, отлично работает для возврата одного свойства сущности.
// 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 ответов
попробуйте это - это то, что фактически эквивалентно вашему первому:
// 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();
OData не поддерживает проецирование на свойства - вы можете обойти это, хотя:
var lambdaQuery = Titles
.Where(t => t.ReleaseYear == 2007)
.Select(x=> new { x.Name })
.AsEnumerable()
.Select(t => t.Name);
используя AsEnumerable()
заставляет последнюю часть запроса выполняться в контексте Linq-to-Objects (вместо запроса OData), где проекция работает просто отлично.
используя данные ответы, я провел несколько тестов и нашел интересные вещи, касающиеся времени выполнения:
// 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 возвращается только свойство "Name"? В то время как в запросе 2 Метод AsEnumerable () возвращает объект со всеми значениями свойств, следовательно, больше времени выполнения?