Entity Framework - Der Lambda-Ausdruck kann nicht in den Typ 'string' konvertiert werden, da es sich nicht um einen Delegattyp handelt

73

Ich verwende Entity Framework in meinem C # -basierten Code. Ich stoße auf eine unerwartete Verrücktheit und suche nach Vorschlägen.

Fall 1, 2, 3, 4 ... Projekte:
RivWorks.dll
RivWorks.Service.dll
RivWorks.Alpha.dll

Beispiele (all diese Arbeiten):
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();
}

etc

Fall "Verrücktheit":
RivWorks.Web.Service.dll (WCF-Projekt)
Enthält dieselben Referenzen wie die anderen Projekte.

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();
    ...
}

Ich erhalte diesen Fehler bei der Kompilierung (das Wort "where" wird in meinem Editor hervorgehoben): Der
Lambda-Ausdruck kann nicht in den Typ "string" konvertiert werden, da es sich nicht um einen Delegatentyp handelt

Irgendwelche Ideen, was das verursachen würde?

Keith Barrows
quelle
Das klingt seltsam. FirstOrDefaultWas passiert, wenn Sie den Anruf entfernen ? Natürlich wird es fehlschlagen, wenn Sie versuchen, es productspäter zu verwenden , aber wird diese Anweisung kompiliert?
Jon Skeet
Auch wenn Sie es ändern, var product = _dbFeed.AutoWithImage.Where(a => a.AutoID == result);was passiert dann? Lassen Sie uns Abfrageausdrücke aus der Mischung nehmen ...
Jon Skeet
1
Alle diese Beispiele schlagen fehl. Ich habe jedoch die Using-Anweisungen in allen meinen Codeteilen durchgesehen und festgestellt, dass mir eine fehlt: Using System.Linq; Das hat den Fehler behoben. <seufz />
Keith Barrows

Antworten:

114

Für diejenigen, die am Ergebnis interessiert sind:
Mir fehlte eine einfache Using-Anweisung am Anfang meines Codes.

using System.Linq;

Dies hat es richtig behoben.

Keith Barrows
quelle
16
Ich bin überrascht, dass weder VS noch ReSharper intelligent genug sind, um diesen Zustand zu erkennen. Zum Glück ist SO schlauer als beide.
bwerks
2
Ich erhalte die gleiche Fehlermeldung und habe (und "hatte immer") System.LINQ verwendet. Natürlich hat eines der Modellmitglieder den Datentyp von string [] in string geändert ...
B. Clay Shannon
101

In meinem Fall fehlte es

using System.Data.Entity;

Miguel Galante
quelle
Ich hatte "using System.Data.EntityClient;" Und obwohl es da ist, ist es ausgegraut / unnötig. System.Data.Entity allein (ohne den "Client") ist nicht zulässig.
B. Clay Shannon
1
Sie, Sir Miguel, sind ein Genie. Vielen Dank!
oHoodie
So nervig. Obwohl ich Visual Studio neu gestartet habe, kam kein IntelliSense zur Rettung.
DankMemester 'Andrew Servania'
12
using System.Linq;
using System.Data.Entity;
Dorathoto
quelle
7

In meinem Fall hatte ich die

Using System.Linq;

aber mir fehlte das && nach einem where-Klauselelement.

Schlechter Code:

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

Richtiger Code (ohne Fehler):

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

Ich hoffe das spart jemandem etwas Zeit.

jhamm
quelle
7

Ich hatte ungefähr eine Stunde lang Probleme damit in einer Telerik Grid-Vorlage in einer Razor-Ansicht. In meinem Fall ist dies:

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

sollte das sein:

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

Der Fall auf "Id" war falsch! Ich hoffe das hilft jemandem. Möglicherweise wird dieser Fehler angezeigt, nur weil Sie eine nicht vorhandene Eigenschaft eingefügt haben!

Chris
quelle
2

Ich bin darauf gestoßen und habe eine andere Lösung gefunden. Ich habe var query = context.Contacts.Where(c => c.FullNameReverse == "TingTong");den genannten Fehler verwendet und erhalten. Der Fehler war, dass ich die Methode FullNameReverse()als Eigenschaft verwendete FullNameReverse. Verpasste die () !!!

FastDev
quelle
1

ich hatte das gleiche problem mit mvc 3 rasiermesser vielleicht hat jemand das gleiche, also möchte ich zeigen, wie ich es in meiner stuation beheben kann

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

Ich habe versucht, enthält zu verwenden, aber daher ist OgrenciId int ich bekomme den hier erwähnten Fehler, so dass durch die Verwendung von gleich das Problem gelöst wird

Mathel
quelle
1

Thread ist ein bisschen alt, aber ich bin gerade erst darauf gestoßen, und nichts im Netz war die Antwort. Auf einer Website wurde erwähnt, was zu der Antwort geführt hat, bei der es sich um ein Datentypproblem handelte. Leider kann ich es nicht wiederfinden. Daher veröffentliche ich meine Lösung hier. Vielleicht wird ein zukünftiger Sucher davon profitieren.

Original: IQueryable test = from r in Datensätzen, in denen r.Record_ID == 100 r auswählen;

Dabei ist Records eine IQueryable, die aus einem vorherigen LINQ-Expresson resultiert.

Das Update besteht darin, Records: (IQueryable <record>) Records in den Ausdruck umzuwandeln. Nachdem es gefunden wurde, macht es vollkommen Sinn. Datensätze werden nicht eingegeben, sodass der LINQ keine Ahnung hat, ob r.Record_ID gültig ist. Die Verwirrung ist die Fehlermeldung, die an Dutzenden von Stellen im ganzen Netz erscheint. In fast allen Fällen ist die Lösung eine der beiden fehlenden Klauseln. Die ein oder zwei, bei denen ich festgestellt habe, dass sie kein Problem darstellen, haben sich nicht die Mühe gemacht, zu veröffentlichen, was das Problem behoben hat.

Hoffe das hilft...

Ragnorok
quelle
0

Ich hatte ein ähnliches Problem beim Binden von Spalten an ein Telerik MVC Grid. Ich hatte eine Id-Eigenschaft in meiner ViewModel-Klasse. (Inspiriert von Chris 'Antwort oben) Ich habe es in XxxId umbenannt und das Problem ist verschwunden. Ich erinnere mich an etwas über MVC, das etwas Besonderes für ID-Eigenschaften tut.

Craig Fisher
quelle
0

Ich hatte ein ähnlich aussehendes Problem, aber mit Rx und in meinem Fall Hinzufügen

using System;

geholfen. FWIW

Das Durcheinander mit diesen fehlenden Erweiterungsmethoden ist manchmal zu ärgerlich.

Valentin Kuzub
quelle
0

In meinem Fall trat dieser Fehler auf, als ich versuchte, Include in clientContext.Load in einer Sharepoint 2013-App zu verwenden.

Ich hatte die Sharepoint-Clientbibliothek folgendermaßen aufgenommen:

using SP = Microsoft.SharePoint.Client;

Um dies zu beheben, habe ich es zusätzlich auch ohne den Namespace hinzugefügt:

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

Mein Problem betraf das Format:

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

Was auch immer dieser Fehler hatte.

Dies war ein Projekt mit MVC, und ich stellte fest, dass mein Problem darin bestand, dass diese Variablen (ID, Name usw.) in meinem Modell "public static int" oder "public static string" enthielten. Als ich "statisch" für alle meine Modellvariablen entfernt habe, wurde der Fehler nicht mehr angezeigt. Hat mich ungefähr einen Tag lang verrückt gemacht ...

vapcguy
quelle
0

Ich hatte dieses Problem in einer etwas anderen Version.
Wenn Sie eine (statische) Methode aus Ihrem Lambda heraus aufrufen, überprüfen Sie den Rückgabetyp. Wenn der Rückgabetyp ein IEnumerable sein sollte (was bei Verwendung von Lambdas häufig der Fall ist), Sie jedoch ein Objekt zurückgeben, liegt offensichtlich ein Problem vor.

Andi Truman
quelle
0

Versuchen Sie es einfach mit System.Linq. Ich denke, es wird Ihnen helfen, diese Probleme zu lösen.

Jinto John
quelle
0

Für .Net Core einfach vorstellen;

using System.Linq;
using Microsoft.EntityFrameworkCore;
Glücklich
quelle