Domanda

Perché questo tiro System.NotSupportedException

string foo(string f) { return f; }
string bar = "";
var item = (from f in myEntities.Beer
            where f.BeerName == foo(bar)
            select f).FirstOrDefault();

Modifica Ecco un MSDN di riferimento che (tipo di) spiega le cose ...

  

Qualsiasi metodo chiama un LINQ to Entities   query che non sono esplicitamente mappati   a una funzione canonica si tradurrà in   un NotSupportedException runtime   un'eccezione essere gettato. Per un elenco dei   metodi CLR che sono mappati   funzioni canoniche, vedere CLR metodo per   Canonical Mapping Function.

Vedi anche http://mosesofegypt.net /post/LINQ-to-Entities-what-is-not-supported.aspx

È stato utile?

Soluzione

EDIT: Okay, il codice fa esplodere perché non sa cosa fare con la chiamata a foo(). La query è costruito come un albero di espressione che viene poi convertita in SQL.

Il traduttore albero di espressione sa di varie cose - come l'uguaglianza di stringa, e vari altri metodi (ad esempio string.StartsWith), ma non sapere che cosa il vostro metodo di foo fa - foo() è una scatola nera come quanto la riguarda. E quindi non può tradurre in SQL.

Altri suggerimenti

La seconda versione fallirà non appena si tenta di scorrere su di esso. Non è possibile utilizzare un metodo definito a livello locale in una clausola IQueryable<> where (naturalmente, è possibile, ma non riuscirà quando i tentativi di provider LINQ da tradurre in SQL).

Perché nella seconda query viene eseguita alcuna query vera e propria. Prova ad aggiungere ToList() dove SingleOrDefault() è.

E 'probabilmente perché la funzionalità di SQL-generazione non è in grado di determinare che cosa fare con la funzione foo(), quindi non può generare output per esso.

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