Beim Versuch, eine Linq-Abfrage durchzuführen, wird folgende Fehlermeldung angezeigt:
LINQ to Entities erkennt die Methode 'Boolean IsCharityMatching (System.String, System.String)' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.
Ich habe viele frühere Fragen gelesen, bei denen derselbe Fehler auftritt. Wenn ich das richtig verstehe, liegt es daran, dass für LINQ to Entities der gesamte Linq-Abfrageausdruck in eine Serverabfrage übersetzt werden muss und Sie daher keine externe Methode aufrufen können drin. Ich konnte mein Szenario noch nicht in etwas umwandeln, das funktioniert, und mein Gehirn beginnt zu schmelzen. Ich hatte gehofft, jemand könnte mich in die richtige Richtung weisen. Wir verwenden Entity Framework und das Spezifikationsmuster (und ich bin neu in beiden).
Hier ist der Code, der die Spezifikation verwendet:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);
charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
Hier ist der linq-Ausdruck:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
return p => p.IsCharityMatching(this.charityName, this.charityReference);
}
Hier ist die IsCharityMatching-Methode:
public bool IsCharityMatching(string name, string referenceNumber)
{
bool exists = true;
if (!String.IsNullOrEmpty(name))
{
if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
!this.alias.ToLower().Contains(name.ToLower()) &&
!this.charityId.ToLower().Contains(name.ToLower()))
{
exists = false;
}
}
if (!String.IsNullOrEmpty(referenceNumber))
{
if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
{
exists = false;
}
}
return exists;
}
Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.
Danke vielmals,
Annelie
Find()
wann SieIsSatisfied()
es verwenden.Antworten:
Wie Sie herausgefunden haben, kann Entity Framework Ihren C # -Code nicht als Teil seiner Abfrage ausführen. Es muss in der Lage sein, die Abfrage in eine tatsächliche SQL-Anweisung zu konvertieren. Damit dies funktioniert, müssen Sie Ihren Abfrageausdruck in einen Ausdruck umstrukturieren, den Entity Framework verarbeiten kann.
quelle
Expression<Func<T,type>>
ist ein sehr guter Ansatz.context.Where(IsSatisfied())
Ich habe den gleichen Fehler in diesem Code:
das war genau der fehler:
Ich habe es so gelöst:
Ich habe vor meiner Tabelle eine .ToList () hinzugefügt, die den Entity- und den Linq-Code entkoppelt und verhindert, dass mein nächster Linq-Ausdruck übersetzt wird
ANMERKUNG: Diese Lösung ist nicht optimal, da die Entitätsfilterung vermieden wird und einfach alle Tabellen in den Speicher geladen werden
quelle
Wenn jemand nach einer VB.Net-Antwort sucht (wie ich es ursprünglich war), hier ist sie:
quelle
Ich hatte ein ähnliches Problem wie Sie und diese LINQ-Dokumentation hat mir geholfen, die richtigen Zeichenfolgenfunktionen zu finden, um die Einschränkungen zu umgehen.
quelle