2010-09-14 2 views
2

J'utilise LINQ avec un service Web ODataSystem.NotSupportedException: Ne peut projeter le dernier type d'entité dans la requête en cours de traduction

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

semble assez simple, non? Les pneus sont une propriété de TyrePatterns. Donc, juste pour être sûr que vous pouvez voir ce que je veux faire, ce que je fais dans le monde magique de SQL ressemblerait à quelque chose comme:

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

Sur notre site, et LINQPad, le code LINQ donne la erreur d'exécution:

System.NotSupportedException: Can only project the last entity type in the query being translated.

aperçu de ce que cette erreur signifie réellement et une solution serait génial.

Répondre

2

En OData joignant les deux tableaux peut se faire de deux façons: Navigations, quelque chose comme ceci: /TyrePatterns (id)/Pneus filtre $ = eq Diamètre 195 Mais cela suppose que vous connaissez l'ID du TypePattern vous cherchez (ce qui ne semble pas être ce que vous cherchez)

ou extensions: /TyrePatterns $ expand = Pneus Mais vous ne pouvez appliquer des filtres aux TyrePatterns, pas au? pneus exapnded.

Ainsi, la bonne façon d'aller sur cette requête est l'inverse: /pneus filtre $ = Diamètre eq 195 & $ expand = TyrePattern Ceci renverra tous les pneus de diamètre 195 et il inclura aussi leur TypePattern (en supposant que la propriété de navigation est bidirectionnel. il est pas exactement celui que vous vouliez, mais il est le plus proche vous pouvez obtenir.

Traduit à LINQ ce ressemblerait à quelque chose comme

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

vous pouvez ensuite sélectionnez simplement les TyrePatterns sur le client facilement. La limite est que vous pouvez uniquement appliquer un filtre au dernier segment de la navigation (la partie du chemin de l'URL).

+0

J'ai eu cette idée mais malheureusement ce n'est pas ce dont j'ai besoin. Je veux une colonne de la table TyrePatterns (TyrePattern.Name). Il y a une relation de un à plusieurs entre TyrePatterns et Tyres (beaucoup de pneus par TyrePattern). En sélectionnant Pneus et non TyrePatterns, j'obtiens des résultats en double, car je ne peux pas faire de Distinct, car l'utilisation de Distinct donne une erreur d'exécution différente. – Zac

+0

Vous pourriez faire distinct sur le client (il téléchargerait un peu plus). Pour l'exécuter sur le client, ajoutez simplement .AsEnumerable() après tout ce qui devrait fonctionner sur le serveur. Tout ce qui suit AsEnumerable() sera exécuté localement sur le client (où Distinct est définitivement supporté). –

+0

Merci pour la réponse, je voudrais pouvoir le marquer comme utile! Comme une solution, cela semble toujours insatisfaisant cependant; cela peut signifier tirer beaucoup de données redondantes (quelques ordres de grandeur plus). J'ai aussi essayé de former un groupe pour se débarrasser des doublons, mais cela a aussi donné une exception non soutenue. – Zac

Questions connexes