Ich bekomme diese Ausnahme:
Das angegebene Typmitglied 'Bezahlt' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätsnavigationseigenschaften unterstützt.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
Meine Modellklasse
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
Zahlungen ist eine verwandte Tabelle, die den Feldbetrag enthält. Die Abfrage funktioniert, wenn ich die Where-Klausel entferne, die korrekte Informationen zu den Zahlungen enthält. Gibt es einen Hinweis darauf, was mit dem Code nicht stimmt?
Gelöst wie die Antwort vorgeschlagen mit:
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
linq
entity-framework
Marc
quelle
quelle
Antworten:
Die Entität versucht, Ihre Paid-Eigenschaft in SQL zu konvertieren und kann dies nicht, da sie nicht Teil des Tabellenschemas ist.
Sie können Entity die Tabelle ohne bezahlten Filter abfragen lassen und dann die nicht bezahlten herausfiltern.
Das würde natürlich bedeuten, dass Sie alle Daten auf den Webserver zurückbringen und die Daten darauf filtern. Wenn Sie auf dem DB-Server filtern möchten, können Sie eine berechnete Spalte in der Tabelle erstellen oder eine gespeicherte Prozedur verwenden.
quelle
Musste nur ein ähnliches Problem lösen. Die oben genannten Lösungen erfordern eine In-Memory-Verarbeitung, was eine schlechte Praxis ist (verzögertes Laden).
Meine Lösung bestand darin, einen Helfer zu schreiben, der ein Prädikat zurückgab:
Sie können Ihre linq-Anweisung wie folgt umschreiben:
Dies ist praktisch, wenn Sie die Berechnungslogik (DRY) wiederverwenden möchten. Nachteil ist, dass die Logik nicht in Ihrem Domain-Modell ist.
quelle
Expression<Func<xx,yy>>
. Ich habe es schon einmal verstanden, aber jetzt sieht es offensichtlich aus.Dieses Problem kann auch von einer
[NotMapped]
Eigenschaft herrühren, die in Ihrem DB-Modell und Ansichtsmodell denselben Namen hat.AutoMapper versucht, es während einer Projektion aus der Datenbank auszuwählen. und die NotMapped-Eigenschaft ist offensichtlich nicht in der Datenbank vorhanden.
Die Lösung besteht in
Ignore
der Eigenschaft in der AutoMapper-Konfiguration beim Zuordnen vom DB-Modell zum Ansichtsmodell.[NotMapped]
Eigenschaft mit NamenFoo
.Foo
in Ihrem Ansichtsmodell nach einer gleichnamigen Eigenschaft ..ForMember(a => a.Foo, b => b.Ignore());
quelle
Diese Konvertierung erfolgt jetzt nur für Entitätsmitglieder, Initialisierer und Entitätennavigationseigenschaften. Um eine Funktion zu erreichen oder einen Eigenschaftenvergleich zu erhalten, müssen wir sie zuerst in eine In-Memory-Liste konvertieren und dann eine Funktion anwenden, um Daten abzurufen.
Daher insgesamt
quelle
Der andere wahrscheinliche Grund ist, dass Sie
IEnumerable
für Ihre Immobilie verwenden, anstattICollection
Also statt:
Mach das:
Und du bist ein hunky dory ... dummes Ding, 2 Stunden zu verlieren.
quelle
Diese Situation kann auch auftreten, wenn Sie von EntityFramework nicht unterstützte Typen verwenden , z. B. int ohne Vorzeichen.
Dies war mein Fall eines solchen Fehlers.
Weitere Informationen zu unterstützten Typen finden Sie unter: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
Es gibt einige Problemumgehungen für solche Situationen, die von GFoley83 erläutert werden: Wie werden vorzeichenlose int / long-Typen mit Entity Framework verwendet?
quelle
Ich war mit diesem Problem konfrontiert, weil ich eine Mitgliedsvariable mit nur einer
get
without set
Eigenschaft hattedas heißt es ist
auto calculated
undnot stored
als spalte inthe table
deshalb ist es
not exist
in dertable schema
quelle
Ihr edmx- und Kontextmodell haben eine andere Eigenschaft, die neu in db hinzugefügt wird.
Aktualisieren Sie Ihr EDMX, aktualisieren Sie es ordnungsgemäß. Bauen Sie Ihr Projekt auf und führen Sie es erneut aus.
Es wird Ihr Problem lösen.
Grüße, Ganesh Nikam
quelle