Sie können Raw SQL in EF Core ausführen - Fügen Sie diese Klasse zu Ihrem Projekt hinzu. Dadurch können Sie Raw SQL ausführen und die rohen Ergebnisse erhalten, ohne ein POCO und ein DBSet zu definieren. Siehe Original-Beispiel https://github.com/aspnet/EntityFramework/issues/1862#issuecomment-220787464.
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.EntityFrameworkCore.Storage;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.EntityFrameworkCore
{
public static class RDFacadeExtensions
{
public static RelationalDataReader ExecuteSqlQuery(this DatabaseFacade databaseFacade, string sql, params object[] parameters)
{
var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
return rawSqlCommand
.RelationalCommand
.ExecuteReader(
databaseFacade.GetService<IRelationalConnection>(),
parameterValues: rawSqlCommand.ParameterValues);
}
}
public static async Task<RelationalDataReader> ExecuteSqlQueryAsync(this DatabaseFacade databaseFacade,
string sql,
CancellationToken cancellationToken = default(CancellationToken),
params object[] parameters)
{
var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>();
using (concurrencyDetector.EnterCriticalSection())
{
var rawSqlCommand = databaseFacade
.GetService<IRawSqlCommandBuilder>()
.Build(sql, parameters);
return await rawSqlCommand
.RelationalCommand
.ExecuteReaderAsync(
databaseFacade.GetService<IRelationalConnection>(),
parameterValues: rawSqlCommand.ParameterValues,
cancellationToken: cancellationToken);
}
}
}
}
Hier ist ein Beispiel dafür, wie es zu benutzen:
// Execute a query.
using(var dr = await db.Database.ExecuteSqlQueryAsync("SELECT ID, Credits, LoginDate FROM SamplePlayer WHERE " +
"Name IN ('Electro', 'Nitro')"))
{
// Output rows.
var reader = dr.DbDataReader;
while (reader.Read())
{
Console.Write("{0}\t{1}\t{2} \n", reader[0], reader[1], reader[2]);
}
}
Ich werde die SqlQuery sehr vermissen und möchte keine benutzerdefinierten Klassen zu meinem DbContext zuordnen, wenn ich wirklich nur ein einfaches DTO für einen bestimmten Anwendungsfall brauche. Ich habe eine Benutzerstimme erstellt, um das Hinzufügen dieser Funktion in EF Core anzufordern, die jeder wählen kann, wenn er diese Funktion zurück möchte: https: //data.uservoice.com/forums/72025-Entity-Framework-Feature-Vorschläge/Vorschläge/13183638-Add-dbcontext-Datenbank-sqlquery-to-entity-framewor –
Nach https://github.com/aspnet/EntityFramework/issues/1862, Dies ist jetzt Ziel für EF Core 1.2 und/oder 1.1.0-preview1 –