System.NotSupportedException:只能在要翻译的查询中投影最后一个实体类型

时间:2010-09-14 09:10:15

标签: c# linq odata notsupportedexception

我正在使用带有ODATA Web服务的LINQ

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 个答案:

答案 0 :(得分:2)

在OData中加入这两个表可以通过两种方式完成: 导航,这样的事情: / TyrePatterns(id)/轮胎?$ filter =直径eq 195 但这假设你知道你正在寻找的TypePattern的id(这似乎不是你想要的)

或扩展: / TyrePatterns?$展开;轮胎 但是,你只能对TyrePatterns应用过滤器,而不是对已经过时的轮胎。

因此,进行此查询的正确方法是另一种方式: /轮胎?$ filter = Diameter eq 195& $ expand = TyrePattern 这将返回所有轮胎直径195,它还将包括他们的TypePattern(假设导航属性是双向的。它不是你想要的那个,但它是你能得到的最接近的。

转换为LINQ,这看起来像

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

然后,您可以轻松地在客户端上选择TyrePatterns。

限制是您只能将过滤器应用于导航中的最后一个段(URL的路径部分)。