2

我将 LINQ 与 ODATA Web 服务一起使用

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:只能投影正在翻译的查询中的最后一个实体类型。

深入了解这个错误的实际含义,一个解决方案会很棒。

4

1 回答 1

2

在 OData 中,可以通过两种方式加入这两个表:似乎不是你要找的东西)

或扩展:/TyrePatterns?$expand=Tyres 但是您只能将过滤器应用于 TyrePatterns,而不是扩展的轮胎。

因此,进行此查询的正确方法是反过来: /Tyres?$filter=Diameter eq 195&$expand=TyrePattern 这将返回所有直径为 195 的轮胎,并且还将包括它们的 TypePattern(假设导航属性为 bi - 定向的。它不是你想要的,但它是你能得到的最接近的。

翻译成 LINQ 这看起来像

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

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

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

于 2010-09-16T08:57:29.310 回答