Ошибка запроса Linq - PullRequest
       32

Ошибка запроса Linq

3 голосов
/ 21 апреля 2011

Я использую следующий запрос Linq:

from p in People
 where p.Name == "George Lucas"
select p.TitlesActedIn

где TitlesActedIn - список. Люди и TitlesActedIn связаны

Но я получаю ошибку:

InvalidCastException: Невозможно привести объект типа 'System.Linq.Expressions.PropertyExpression' к типу 'System.Data.Services.Client.ResourceExpression'.

Пожалуйста, предложите решение.

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

Очень простой способ сделать это:

var query = People
    .Expand("TitlesActedIn")
    .Where(p => p.Name == "George Lucas")
    .First()
    .TitlesActedIn.Select(t => t.ShortName);              
query.Dump();

Важно отметить, что произойдет сбой, если имя, которое вы передаете, не существует.(Первый оператор сгенерирует исключение. Вам нужно либо гарантировать, что имя существует, либо сделать это в два этапа.


Если вы хотите сделать это за один шаг, это сводится к этому: (пожалуйста, обратите внимание, что возвращается)

http://odata.netflix.com/catalog/People()?$filter=Name eq 'George Lucas'&$top=1&$expand=TitlesActedIn

Вам нужно развернуть или он прекратит оценку после .First(), потому что TitlesActedIn будет пустым.

Это в основном переводится, чтобы выбратьPerson, включите (разверните) ассоциацию TitlesActedIn, затем выберите имя (на стороне клиента)

Недостатком этого является то, что вы извлекаете все (все поля) из таблицы Titles. То есть для каждого связанного заголовкаЛицу, которого он возвращает (Название, Год, Описание, Короткое имя и т. д.).

Если вы сделали это в двух запросах, вы можете извлечь только «Короткое имя» из ассоциации TitlesActedIn.

3 голосов
/ 21 апреля 2011

ОБНОВЛЕНО: См. Этот вопрос и ответ , чтобы понять ограничения на выбор многих в службах данных + Другое решение, основанное на $ expand (обратите внимание, что для поддержки требуется серверразвернуть)

Если это Службы данных WCF, а TitlesActedIn представляет собой набор связанных фильмов.Тогда вы можете сделать это в одном запросе, только если Person.Name является первичным ключом.

Чтобы проиллюстрировать это:

var titles = from p in people
             where p.Name == "George Lucas"
             from m in p.TitlesActedIn
             select m;

Будет делать то, что вы хотите, но только если Имя является ключомсущность Person, в противном случае это не поддерживается.

Если имя не является ключевым, один из способов сделать это (сегодня) - это два запроса, примерно так:

var key = (from p in people
          where p.Name == "George Lucas"
          select new {p.Id}).Single().Id;

var titles = from p in people
             where p.Id == key
             from m in p.TitlesActedIn
             select m;

Еще один вариантбыло бы сделать расширение:

var george = (from p in people.Expand("TitlesActedIn")
             where p.Name == "George Lucas"
             select p).Single();

var titles = george.TitlesActedIn;

Но это зависит от сервера, поддерживающего $ expand - что делают не все серверы ...

Обратите внимание, что в настоящее время мы работаем над добавлением любого/ вся поддержка OData и WCF Data Services, после того, как она будет выпущена, вы сможете написать:

var titles = from t in titles
             where t.Actors.Any(a => a.Name == "George Lucas")
             select t;

Надеюсь, это поможет

Примечание: в коде, который получает ключ для Джорджа Лукаса, я создаю анонимный тип, потому что сегодня WCF Data Services не поддерживает материализацию примитивов напрямую.

1 голос
/ 22 апреля 2011

Интересно, что следующие операции:

from p in People
where p.Name == "George Lucas"
select new { p.TitlesActedIn }

работают следующим образом:

(from p in People
where p.Name == "George Lucas"
select new { p.TitlesActedIn }).First().TitlesActedIn

Клиент WCF автоматически добавляет вызов расширения в перевод URI:

http://odata.netflix.com/Catalog/People()?$filter=Name eq 'George Lucas'&$top=1&$expand=TitlesActedIn&$select=TitlesActedIn/*
0 голосов
/ 15 апреля 2013

Я получаю похожую ошибку, если использую предложение group by вместе с лямбда-выражением для извлечения данных с использованием службы данных WCF. Я узнал, что некоторые операции не поддерживаются службами данных WCF. Убедитесь, что вы не используете неподдерживаемые операции LINQ.

http://msdn.microsoft.com/en-us/library/ee622463.aspx

...