System.NotSupportedException: Può proiettare solo l'ultimo tipo di entità nella query in corso di traduzione

StackOverflow https://stackoverflow.com/questions/3707467

Domanda

Sto usando LINQ con un servizio odata web

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

Sembra abbastanza semplice, giusto? Pneumatici è un propery di TyrePatterns. Quindi, solo per essere sicuri di poter vedere quello che voglio fare, quello che sto facendo nel magico mondo di SQL sarebbe simile:

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

Nel nostro sito, e in LINQPad, il codice LINQ dà l'errore di run-time:

System.NotSupportedException:. Può proiettare solo l'ultimo tipo di entità nella query di essere tradotto

indicazioni su ciò che questo errore significa in realtà e una soluzione sarebbe terribile.

È stato utile?

Soluzione

In OData che unisce le due tabelle può essere fatto in due modi: Navigazioni, qualcosa di simile a questo: / TyrePatterns (id) / gomme? $ filter = diametro eq 195 Ma questo presuppone che si conosce l'ID della TypePattern che stai cercando (che non sembra essere quello che stai cercando)

o espansioni: / TyrePatterns? $ Espandere = Pneumatici Ma allora si può applicare solo filtri per i TyrePatterns, non alle gomme exapnded.

Quindi il modo giusto per andare a questa query è il contrario: / gomme? $ filter = diametro eq 195 & $ espandere = TyrePattern Ciò restituirà tutti i pneumatici con diametro 195 e comprenderà anche la loro TypePattern (assumendo la proprietà di navigazione è bidirezionale. Non è esattamente quello che volevi, ma è il più vicino si può ottenere.

Tradotto in LINQ questo sarebbe simile a

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

È possibile selezionare solo i TyrePatterns sul client con facilità.

La limitazione è che è possibile applicare solo filtro per l'ultimo segmento della navigazione (la parte del percorso URL).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top