2010-01-13 11 views
68

Sto utilizzando Entity Framework nel mio codice basato su C#. Sto incontrando una stranezza inaspettata e sto cercando suggerimenti.Entity Framework: impossibile convertire l'espressione lambda in "string" perché non è un tipo delegato

Caso 1, 2, 3, 4 ... Progetti:
RivWorks.dll
RivWorks.Service.dll
RivWorks.Alpha.dll

Campioni (tutti di questi lavori):
RivWorks.Alpha.dll:

public static bool EndNegotitation(long ProductID) 
{ 
    var product = (from a in _dbFeed.AutoWithImage 
        where a.AutoID == ProductID select a).FirstOrDefault(); 
... 
} 

RivWorks.Service.dll

public static RivWorks.Model.NegotiationAutos.AutoWithImage 
    GetProductById(long productId) 
{ 
    var myProduct = from a in _dbFeed.AutoWithImage 
        where a.AutoID == productId select a; 

    return myProduct.FirstOrDefault(); 
} 
public static List<RivWorks.Model.NegotiationAutos.AutoWithImage> 
    GetProductByCompany(Guid companyId) 
{ 
    var myProduct = from a in _dbFeed.AutoWithImage 
        where a.CompanyID == companyId select a; 

    return myProduct.ToList(); 
} 

ecc

Case "stranezza":
(progetto WCF) RivWorks.Web.Service.dll
Contiene gli stessi riferimenti come gli altri progetti.

public NegotiateSetup GetSetup(string method, string jsonInput) 
{ 
    ... 
    long.TryParse(ProductID, out result); 
    var product = (from a in _dbFeed.AutoWithImage 
        where a.AutoID == result select a).FirstOrDefault(); 
    ... 
} 

sto ottenendo questo errore di compilazione (la parola "dove" è evidenziato nel mio editor):
Impossibile convertire espressione lambda al tipo 'stringa' perché non è un tipo delegato

Qualche idea che cosa potrebbe causare questo?

+0

Sembra strano. Se rimuovi la chiamata a 'FirstOrDefault', cosa succede?Ovviamente fallirà dove proverai a usare 'product' in seguito, ma questa istruzione viene compilata? –

+0

Inoltre, se lo si cambia in 'var product = _dbFeed.AutoWithImage.Where (a => a.AutoID == risultato);' cosa succede allora? Prendiamo le espressioni di query dal mix ... –

+1

Tutti questi esempi falliscono. Tuttavia, ho esaminato le istruzioni Using in tutti i miei pezzi di codice e ho scoperto che ne mancava uno: Using System.Linq; Quello ha riparato l'errore.

risposta

106

Per chi è interessato al risultato:
Mi mancava una semplice istruzione Using in testa al mio codice.

using System.Linq; 

Questo problema è stato risolto correttamente.

+13

Sono sorpreso che né VS né ReSharper siano abbastanza intelligenti da rilevare questa condizione. Per fortuna SO è più intelligente di entrambi. – bwerks

+0

Grazie, non ci ho pensato fino a quando non ho letto questo. –

+2

Sto ricevendo lo stesso errore err, e ho (e "ho sempre avuto") usando System.LINQ. Naturalmente, uno dei membri del modello ha cambiato i tipi di dati da stringa [] a stringa ... –

7

Nel mio caso, ho avuto l'

Using System.Linq; 

ma mi mancava il & & dopo un oggetto in cui clausola.

Bad Codice:

item.Group.ID == grp.ID 
p.Product_Status_Flag == 1 && 
item.Valid 

codice corretto (senza errori):

item.Group.ID == grp.ID && // <- This was missing and I didn't see it right away. 
p.Product_Status_Flag == 1 && 
item.Valid 

spero che questo consente di risparmiare qualcuno un po 'di tempo.

7

Ero in difficoltà con questo modello in una griglia di Telerik all'interno di una visualizzazione Razor per circa un'ora. Nel mio caso, questo:

columns.Bound(x => x.ID).Template(@<text><a href="@(Model.AppUrl + AdditionalFeeTypes/Details/" + item.ID)">@item.ID</a></text>); 

doveva essere questo:

columns.Bound(x => x.Id).Template(@<text><a href="@(Model.AppUrl + AdditionalFeeTypes/Details/" + item.Id)">@item.Id</a></text>); 

Il caso su "Id" era sbagliato! Spero che questo aiuti qualcuno.Potresti ricevere questo errore solo perché hai inserito una proprietà inesistente!

0

Stavo riscontrando un problema simile con il binding di colonne a una griglia MVC di Telerik. Avevo una proprietà Id sulla mia classe ViewModel. (Ispirato dalla risposta di Chris sopra) L'ho rinominato in XxxId e il problema è andato via. Mi sembra di ricordare qualcosa su MVC che fa qualcosa di speciale per le proprietà di identificazione.

0

Ho avuto un problema simile, ma guardando con Rx e nel mio caso l'aggiunta

using System; 

aiutato. FWIW

Il disordine con quei metodi di estensione mancanti è troppo fastidioso a volte.

1

ho avuto lo stesso problema con MVC 3 rasoio forse qualcuno ha lo stesso modo voglio mostrano come risolvere il problema nel mio stuation

List<Taksit> lst = db.Taksit.Where(y => y.OgrenciId.Equals(Convert.ToInt32(list[0].Id))).ToList(); 

Ho cercato di usare contiene, ma da qui OgrenciId è int ottengo l'errore menzionato qui così usando uguali il problema è risolto

2

Mi sono imbattuto in questo e ho trovato una soluzione diversa. Stavo usando var query = context.Contacts.Where(c => c.FullNameReverse == "TingTong"); e ottenendo l'errore citato. L'errore era che stavo usando il metodo FullNameReverse() come proprietà FullNameReverse. Perso il() !!!

85

Nel mio caso mancava

using System.Data.Entity;

+0

Ho avuto "using System.Data.EntityClient;" E, anche se è lì, è grigio/inutile. System.Data.Entity da solo (senza il "Client") non è consentito. –

+1

Tu, Sir Miguel, sei un genio. Grazie! – oHoodie

0

Nel mio caso ho avuto questo errore quando si tenta di utilizzare includere in clientContext.Load in Sharepoint 2013 app.

libreria client Sharepoint avevo incluso in questo modo:

using SP = Microsoft.SharePoint.Client; 

per riparare, in aggiunta ho anche aggiunto che senza il namespacing:

using Microsoft.SharePoint.Client; 
using SP = Microsoft.SharePoint.Client; 
0

Il mio problema ha coinvolto il formato:

.Columns(columns => { 
    columns.Bound(p => p.Id).Filterable(false); 
    columns.Bound(p => p.Name).Width(250); 
    ... 

Ogni p. Qualunque fosse questo errore.

Si trattava di un progetto che utilizzava MVC e ho riscontrato che il mio problema era avere "public static int" o "public static string" su queste variabili (Id, Name, ecc.) Nel mio modello. Quando ho rimosso "statico" su tutte le variabili del mio modello, non ho più ricevuto l'errore. Mi stava facendo impazzire per circa un giorno ...

0

Ho avuto questo problema in una versione leggermente diversa.
Se si chiama un metodo (statico) dall'interno di lambda, controllare il tipo di reso. Se il tipo restituito deve essere un oggetto IEnumerable (che spesso è vero quando si utilizza lambdas) ma si restituisce l'oggetto, ovviamente si ha un problema.

7
using System.Linq; 
using System.Data.Entity; 
0

Basta provare utilizzando System.Linq; Penso che ti aiuterà a risolvere questi problemi.

Problemi correlati