2015-12-17 6 views
5

ausführen Ich habe beschlossen, eines meiner Projekte in Entity Framework 7 (rc1-final) zu verschieben. Ich ziele auf SQL Server und EntityFramework.MicrosoftSqlServer Paket ist ebenfalls installiert.Ist es möglich, benutzerdefinierte SQL-Abfrage mit EF7

Ich habe nur ein Problem: Es scheint, als ob ich benutzerdefinierte SQL-Abfrage nicht ausführen kann, um einige Objekte aus der DB zu holen.

DatabaseFacade Objekt (die über DbContext.Database Eigenschaft zugegriffen werden kann) bietet eine Erweiterungsmethode ExecuteSqlCommand (die nichts zurückgibt), aber es bietet keine SqlQuery<T> Methode, die Objekte holen können. Beide Methoden waren in der guten alten EF 6 verfügbar, aber die neue EF 7 erklärt nur die erste.

Also, ist SqlQuery<T> Methode noch hier (aber verschoben/umbenannt) oder es wurde komplett aus der neuen EF-Implementierung entfernt?

Natürlich ist es absolut möglich, es in einer ausführlichen Art zu lösen (mit SqlCommand und seine ExecuteReader Methode), aber ich bevorzuge es zu vermeiden.

Antwort

6

EntityFramework.Relational macht die folgende Erweiterungsmethode verfügbar;

public static IQueryable<TEntity> FromSql<TEntity>(
     [NotNull] this IQueryable<TEntity> source, 
     [NotNull] [NotParameterized] string sql, 
     [NotNull] params object[] parameters) 
     where TEntity : class 

So können Sie dies tun;

+3

Danke, aber ich weiß, über diese Methode schon, aber leider muss es IQueryable als Eingangsparameter. Wie ich weiß, sollte diese Methode zusammen mit einigen DbSet verwendet werden, die wiederum innerhalb von DbContext definiert werden sollten. Mein Fall ist ein wenig anders - ich möchte Objekte erhalten, die nicht in meinem DbContext vorhanden sind (d. H. Nur Abfrage ausführen und Objekt des Typs T für jede zurückgegebene Zeile erstellen). –

+0

In diesem Fall verwenden Sie einfach den zugrunde liegenden SqlCommand wie in [diese Antwort] (http://stackoverflow.com/a/34191033/469777). –

+0

Eigentlich verwende ich diesen Ansatz jetzt (Command + ExecuteReader). Es ist im Vergleich mit fehlenden SqlQuery ausführlich, aber es funktioniert natürlich. Übrigens, danke für deine Zeit und deine Antwort - es ist definitiv nützlich - schätze es. –

0

Es sieht so aus, als ob Sie die Sql-Methode für das migrationBuilder-Objekt verwenden können, das an die Up- und Down-Methode übergeben wird. Zumindest in RC2.

protected override void Up(MigrationBuilder migrationBuilder) 
{ 
    ... 
    migrationBuilder.Sql("<Sql here>"); 
} 
+1

Diese Methode 'migrationBuilder.Sql' scheint in der EF Core RTM-Version nicht zu existieren. Wer kennt das Äquivalent? – Reza

1

Um eine custome SQL-Abfrage in EF7 ausführen, können Sie eine „fake“ Tabelle der Struktur wie Struktur Ihrer SQL-Abfrage zurückkehrt erstellen.

Beispiel: Ihre Anfrage ist: "wählen a.a, B.B von A, B, wo a.b_id = b.id". Die falsche Tabelle enthält 2 Spalten wie A, B. In Ihrem Programm, können Sie dies tun:

var result = myDatabaseContext.FakeTables.FromSql("select a.A, b.B from A,B where a.b_id=b.id"); 
Verwandte Themen