System.NotSupportedException: может проецировать только последний тип сущности в переводимом запросе. - PullRequest
2 голосов
/ 14 сентября 2010

Я использую LINQ с веб-сервисом ODATA

from tp in TyrePatterns
from t in tp.Tyres
where t.Diameter == 195
select tp

Кажется, достаточно просто, верно? Шины являются собственностью TyrePatterns. Просто чтобы быть уверенным, что вы можете видеть, что я хочу сделать, то, что я делаю в волшебном мире SQL, будет выглядеть примерно так:

SELECT DISTINCT TyrePatterns.Name
FROM TyrePatterns
INNER JOIN Tyres ON Tyres.TyreID = TyrePatterns.TyreID
WHERE Tyres.Diameter = 195

На нашем сайте и в LINQPad код LINQ выдает ошибку времени выполнения:

System.NotSupportedException: может проецировать только последний тип сущности в переводимом запросе.

Понимание того, что на самом деле означает эта ошибка, и ее решение было бы потрясающим.

1 Ответ

2 голосов
/ 16 сентября 2010

В OData объединение двух таблиц может быть сделано двумя способами: Навигация, примерно так: / TyrePatterns (id) / Шины? $ Filter = Diameter eq 195 Но это предполагает, что вы знаете идентификатор искомого TypePattern (который, кажется, не то, что вы ищете)

Или расширения: / TyrePatterns? $ = Расширения шины Но тогда вы можете применять фильтры только к TyrePatterns, а не к выделенным шинам.

Таким образом, правильный способ выполнить этот запрос - наоборот: / Шины? $ Фильтр = диаметр экв. 195 & $ раскрыть = TyrePattern Это вернет все шины с диаметром 195, а также включит их TypePattern (при условии, что свойство навигации является двунаправленным. Это не совсем то, что вы хотели, но это самое близкое, что вы можете получить.

В переводе на LINQ это будет выглядеть примерно так:

from t in Tyres.Expand("TyrePatterns") where t.Diameter == 195 select t

Затем вы можете легко выбрать только TyrePatterns на клиенте.

Ограничением является то, что вы можете применять фильтр только к последнему сегменту в навигации (часть пути URL).

...