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



深入了解此错误的实际含义和解决方案将是非常不错的。

最佳答案

在OData中,可以通过两种方式将两个表连接起来:
导航,如下所示:
/ TyrePatterns(id)/ Tyres?$ filter =直径eq 195
但这假设您知道要查找的TypePattern的ID(似乎不是您要查找的TypePattern的ID)

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

因此,执行此查询的正确方法是相反的方式:
/ Tyres?$ filter =直径eq 195&$ expand = TyrePattern
这将返回所有直径为195的轮胎,并且还将包括其TypePattern(假设导航属性是双向的。它并非您想要的那个,但它是您可以获得的最接近的轮胎。

转换为LINQ看起来像

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

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

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

10-07 16:48