2017-02-06 2 views
2

Ich warf eine Prototyp-Anwendung mit Hand gerollt ADO-Verbindungen statt EF, und ich bin jetzt "upgraden". Eine meiner gespeicherten Prozeduren sieht folgendermaßen aus:Wie kann ich tabellarische String-Daten aus einer dynamischen gespeicherten Entity Framework-Prozedur zurückgeben?

DECLARE @tableName NVARCHAR(999); 

SELECT @tableName = DatabaseTable 
FROM JobQueue 
WHERE JobId = @JobId; 

DECLARE @sql NVARCHAR(999); 

SET @sql = 'SELECT * FROM ' + @tableName; 

EXEC (@sql); 

Jetzt wird EF in diesem Fall nichts über die Tabelle wissen. Es kann eine beliebige Anzahl von Spalten eines beliebigen Datentyps haben. Es kann keiner Entität zugeordnet werden, da es dynamisch ist und nicht mehr existiert, sobald dieser Job beendet ist. Also muss die Abfrage dynamisch sein und das bedeutet auch, dass ich auch keinen Rückgabetyp in EF erzeugen kann.

Mein ursprünglicher ADO-Code packte nur die Daten und es in ein List<string[]> wie folgt zu lesen:

List<string[]> result = new List<string[]>(); 
while (dr.Read()) 
{ 
    string[] values = new string[dr.FieldCount]; 
    for (int i = 0; i < dr.FieldCount; i++) 
    { 
     values[i] = dr[i].ToString(); 
    } 
    result.Add(values); 
} 

Und das war in Ordnung. Aber ich kann nicht herausfinden, wie ich EF dazu bringen kann, etwas Ähnliches zu tun. Der nächstgelegene ich habe, ist dies:

var query = Entities.Database 
      .SqlQuery<List<string>>("exec spGetJobData @JobId", new SqlParameter("JobId", jobId)) 
      .ToList(); 

, die die erwartete Anzahl der Elemente in der Liste zurück, aber alle von ihnen sind leer.

Wie bekomme ich meine Daten?

+0

EF ist nicht darauf ausgerichtet, das zu tun, was Sie verlangen. Sie können explizit angeben, welchem ​​Typ das Ergebnis zugeordnet werden soll, und zwar für einen Typ, aber nicht für eine Vielzahl von Typen. Sie müssen wählen, ob Sie Ihren Code behalten möchten und ob er "dynamisch" ist. oder umschreiben, um stark typisierte Entitäten zu verwenden. – Theo

+1

Lassen Sie Ihre ADO-Implementierung einfach (aber verwenden Sie Entities.Database.Connection). Es wird nicht schlimmer sein, als das Gleiche über SqlQuery zu tun. – Evk

+0

@Theo Entschuldigung, das habe ich nicht klargestellt. Ich bin glücklich, in diesem Fall alles wie eine Schnur zu behandeln. Oder anders gesagt, es ist mir egal, was die Datentypen in der Originaltabelle sind, für meine Zwecke können sie alle als Strings dargestellt werden. Aber offensichtlich müssen sie eine Liste oder eine Liste von Listen oder dergleichen sein. –

Antwort

1

EF möchte stark definierte Typen für alle Datenbankrückgaben haben und erlaubt nur 1-zu-1-Zuordnung. Die kurze Antwort ist, dass EF nicht unterstützt, was Sie wollen. Es scheint, dass Ihre Optionen sind, Ihren Code entweder neu zu schreiben, um EF zu verwenden oder unverändert zu lassen.

Verwandte Themen