Ich habe eine abstrakte Klasse, die von zwei Klassen geerbt wird. Beide Klassen repräsentieren Tabellen in der Datenbank. Ich habe Probleme, Ausdrücke in der abstrakten Klasse zuzuordnen und deshalb erhalte ich Ausnahmen, die nicht in SQL übersetzt werden können. Alle Fragen, die ich in Stackoverflow gefunden habe, sprechen über Spalten, die bereits für mich arbeiten.Mapping Ausdrücke in LINQ-to-sql abstrakte Klasse
Unten ist ein sehr einfacher Code, der zeigt, was ich meine. Auto und Motorrad haben vollständig getrennte Implementierungen von _isNew Expression.
public abstract class Vehicle {
public abstract boolean IsNew;
}
public partial class Car: Vehicle {
public override boolean IsNew {
get { _isNew.Invoke(this); }
}
}
public partial class Motorcycle: Vehicle {
public override boolean IsNew {
get { _isNew.Invoke(this); }
}
}
Ich möchte in der Lage sein, entweder _isNew Ausdruck oder IsNew Eigenschaft auf einem IQueryable zu nennen, und doch läuft es die _isNew der Car-Klasse bei Fahrzeugtyp des Autos ist. Kann ich das überhaupt schaffen? Alle von mir getesteten Lösungen haben eine Ausnahme verursacht, die nicht in SQL übersetzt werden kann.
Was ist '_isNew'? Kann nicht ein Ausdruck sein, der * übersetzt werden kann? –
_isNew ist ein Ausdruck, der in SQL übersetzt werden kann (zB für Autos Ausdruck> _isNew = (v) => v.Age <2; für Motorräder Ausdruck > _isNew = (v) => v.Age <1; (PS: Alter ist eine DB-Spalte) Mein Hauptproblem ist, wie kann ich das richtige _isNew auswählen, das auf Vehicle aufgerufen werden soll, abhängig von der geerbten Klasse Die Funktion IsNew wird einen SQL-Übersetzungsfehler verursachen und ich kann nicht entscheiden, welche _IsNew aufrufen soll, ohne den Typ und das Casting jedes Mal zu überprüfen. –
Sami
Ich denke, das wird überhaupt nicht funktionieren, denn um Ihre Überschreibung von IsNew aufzurufen, wird eine konkrete Instanz von Auto oder Motorrad notwendig sein. Daher müsste EF zuerst die Elemente abfragen, um diese Instanzen zu erstellen. – Peit