2015-12-17 12 views
5

Ho deciso di spostare uno dei miei progetti in Entity Framework 7 (rc1-final). Sono destinato a SQL Server e viene installato anche il pacchetto EntityFramework.MicrosoftSqlServer.È possibile eseguire query SQL personalizzate utilizzando EF7

Ho un solo problema: sembra che non sia possibile eseguire query SQL personalizzate per recuperare alcuni oggetti dal DB.

DatabaseFacade oggetto (a cui si accede tramite DbContext.Database struttura) fornisce un metodo di estensione ExecuteSqlCommand (che restituisce nulla), ma non fornisce SqlQuery<T> metodo che consenta di recuperare oggetti. Entrambi i metodi erano disponibili nel vecchio EF 6, ma il nuovo EF 7 dichiara solo il primo.

Quindi, il metodo SqlQuery<T> è ancora qui (ma spostato/rinominato) oppure è stato completamente rimosso dalla nuova implementazione EF?

Ovviamente è assolutamente possibile risolverlo in modo dettagliato (utilizzando SqlCommand e il suo metodo ExecuteReader) ma preferisco evitarlo.

risposta

6

EntityFramework.Relational espone il seguente metodo di estensione;

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

Così puoi farlo;

myDatabaseContext.Customers.FromSql("SELECT * FROM Customers WHERE Name='p0'", "timothy"); 
+3

Grazie, ma sapere che il metodo già, ma, purtroppo, ha bisogno di IQueryable come parametro di input. Come ho capito, questo metodo dovrebbe essere usato insieme ad alcuni DbSet che, a loro volta, dovrebbero essere definiti all'interno di DbContext. Il mio caso è leggermente diverso: voglio ottenere oggetti che non sono presenti nel mio DbContext (ad esempio, esegui la query e creo l'oggetto di tipo T per ogni riga restituita). –

+0

In tal caso basta usare il SqlCommand sottostante come in [questa risposta] (http://stackoverflow.com/a/34191033/469777). –

+0

Attualmente sto usando questo approccio ora (Command + ExecuteReader). È prolisso in confronto a SqlQuery mancante , ma ovviamente funziona. A proposito, grazie per il vostro tempo e per la vostra risposta - è sicuramente utile - apprezzatelo. –

0

Sembra che è possibile utilizzare il metodo di Sql sull'oggetto migrationBuilder che è passato attraverso i metodi Su e Giù. Almeno in rc2.

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

Questo metodo 'migrationBuilder.Sql' non sembra esistere nella versione RT Core EF. Qualcuno sa dell'equivalente? – Reza

1

per eseguire una query SQL custome in EF7, è possibile creare una tabella di "falso" che la struttura come la struttura delle vostre dichiarazioni di query SQL.

Esempio: tua domanda è: "selezionare a.A, b.B da A, B dove a.b_id = b.id". La tabella falsa conterrà 2 colonne come A, B. Nel programma, si può fare questo:

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