我正在使用带有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:只能在要翻译的查询中投影最后一个实体类型。
深入了解此错误的实际含义,解决方案非常棒。
答案 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的路径部分)。