wake-up-neo.com

LINQ to Entities erkennt die Methode nicht

Beim Versuch, eine linq-Abfrage auszuführen, wird folgende Fehlermeldung angezeigt:

LINQ to Entities erkennt die Methode 'Boolean IsCharityMatching (System.String, System.String) 'Methode und diese Die Methode kann nicht in einen Speicherausdruck übersetzt werden.

Ich habe eine Menge vorhergehender Fragen gelesen, bei denen die gleiche Fehlermeldung angezeigt wird. Wenn ich dies richtig verstanden habe, ist dies darauf zurückzuführen, dass für LINQ to Entities der gesamte linq-Abfrageausdruck in eine Serverabfrage übersetzt werden muss. Daher können Sie keine externe Methode aufrufen drin. Ich konnte mein Szenario noch nicht in etwas umwandeln, das funktioniert, und mein Gehirn beginnt zu schmelzen, also hoffte ich, dass mich jemand in die richtige Richtung weisen könnte. Wir verwenden Entity Framework und das Spezifikationsmuster (und ich bin neu für beide).

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

94
annelie

Wie Sie herausgefunden haben, kann Entity Framework Ihren C # -Code nicht als Teil seiner Abfrage ausführen. Es muss die Abfrage in eine tatsächliche SQL-Anweisung konvertieren können. Damit dies funktioniert, müssen Sie Ihren Abfrageausdruck in einen Ausdruck umstrukturieren, den Entity Framework verarbeiten kann.

public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
    string name = this.charityName;
    string referenceNumber = this.referenceNumber;
    return p => 
        (string.IsNullOrEmpty(name) || 
            p.registeredName.ToLower().Contains(name.ToLower()) ||
            p.alias.ToLower().Contains(name.ToLower()) ||
            p.charityId.ToLower().Contains(name.ToLower())) &&
        (string.IsNullOrEmpty(referenceNumber) ||
            p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
}
103

Ich habe den gleichen Fehler in diesem Code erhalten:

 var articulos_en_almacen = xx.IV00102.Where(iv => alm_x_suc.Exists(axs => axs.almacen == iv.LOCNCODE.Trim())).Select(iv => iv.ITEMNMBR.Trim()).ToList();

das war genau der fehler:

System.NotSupportedException: 'LINQ to Entities erkennt die Methode' Boolean Exists (System.Predicate`1 [conector_gp.Models.almacenes_por_sucursal]) '' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

Ich habe diesen Weg gelöst:

var articulos_en_almacen = xx.IV00102.ToList().Where(iv => alm_x_suc.Exists(axs => axs.almacen == iv.LOCNCODE.Trim())).Select(iv => iv.ITEMNMBR.Trim()).ToList();

Ich fügte vor meiner Tabelle ein .ToList () hinzu. Dies entkoppelt den Entity- und den linq-Code und vermeidet, dass mein nächster linq-Ausdruck übersetzt wird

HINWEIS: Diese Lösung ist nicht optimal, da Entitätsfilterung vermieden wird und alle Tabellen einfach in den Arbeitsspeicher geladen werden

0