2016-07-25 14 views
0

Ich habe folgende (vereinfachte) Entity SQL-Abfrage verweisen. Die Aufzählung ist in der EDMX-Datei definiert.Wie Aufzählungstyp in Entity SQL

Wie es ist, funktioniert diese Abfrage nicht, eine Ausnahme zu dem Effekt verursachend, dass CustomerStatus mit Int32 nicht kompatibel ist (sein zugrundeliegender Typ ist Int). Ich konnte jedoch keine Möglichkeit finden, eine Liste von CustomerStatus-Werten für die IN {}-Klausel zu definieren, unabhängig davon, welchen Namespace dem Namen der Aufzählung vorangestellt wurde. Zum Beispiel

SELECT VALUE a 
FROM Customers AS a 
WHERE a.Status NOT IN { MyModelEntities.CustomerStatus.Reject, MyModelEntities.CustomerStatus.Accept } 

funktionierten nicht, eine Ausnahme zu werfen sagen, es ist nicht MyModelEntities.CustomerStatus in dem Behälter, oder so finden.

Schließlich griff ich die Status zu Casting für eine elegantere Lösung in int, wie

SELECT VALUE a 
FROM Customers AS a 
WHERE CAST(a.Status AS System.Int32) NOT IN { 2, 3 } 

aber ich hatte gehofft.

+0

Können Sie nicht einfach die Enumeration (int) vor der Abfrage gesendet werden? –

+0

@DanielLorenz was meinst du? Wie Sie in der letzten Abfrage sehen können, habe ich es schließlich getan. –

+0

Bauen Sie das SQL selbst oder verwenden Sie ein DbSet? Wenn Sie das SQL selbst erstellen, müssen Sie ein int verwenden, da die Datenbank kein Enum-Konzept hat. EF übersetzt das zu einem int. –

Antwort

0

Oooh, Sie schreiben Entity SQL direkt. Ich sehe ... Irgendeinen Grund, warum Sie nicht DbSet verwenden, anstatt Entity SQL von Hand zu schreiben? Konnte immer

var statuses = new [] { Status.A, Status.B }; 
var query = context.SomeTable.Where(a => !statuses.Contains(a.Status)).ToList(); 
+0

Der Grund ist, dass die Abfrage tatsächlich dynamisch mit 'String.Format' generiert wird, wobei die ausgewählte Spalte von der Entität ersetzt wird (die aktuelle Abfrage wählt tatsächlich eine Navigationseigenschaft aus' a') und die 'WHERE'-Klausel modifiziert wird. –

+0

Hmm, ich sehe hier wirklich nichts, was die Verwendung von dynamischem SQL rechtfertigen würde. Sie können nicht ctx.Customers.Where (a => status ..). Wählen Sie (a => a.Value) .ToList()? –

+0

Die tatsächliche Abfrage ist komplizierter. Ich kann 'a.ValueA' oder' a.ValueB' wählen, und zusätzlich zu der Statusliste hat die 'WHERE'-Klausel zusätzliche dynamische Bedingungen. So etwas wie 'String.Format (" SELECT VALUE a. {0} FROM Kunden als WHERE CAST (a.Status AS System.Int32) NICHT IN {{2, 3}} UND a. {1} IST NICHT NULL " , selectedProperty, filterProperty) ' –