Выполнить RAW SQL на DbContext в EF Core 2.1 - PullRequest
0 голосов
/ 28 ноября 2018

Я исследовал это и всегда находил примеры, подобные этому:

var blogs = context.Blogs
    .FromSql("SELECT * FROM dbo.Blogs")
    .ToList();

Проблема в том, что я не хочу запускать мой сырой SQL в таблице блогов.По сути, я хочу реализовать такой интерфейс:

bool ExecuteNonSafeSql(
    string connectionString,
    string sql);

Есть ли способ сделать это с помощью DbContext?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

На момент написания (EF Core 2.1) невозможно выполнить произвольную последовательность, возвращающую команду SQL.

Только типы сущностей и Типы запросов поддерживаются через FromSql.

Таким образом, наиболее близким решением является определение типа запроса (класс, содержащий результат запроса) и использование FromSql, но это не универсально - типы запросов должны быть зарегистрированы в DbContext через свободный API иметод должен получить универсальный аргумент, указывающий этот тип, например

class ResultType
{
   // ...
}

, затем

modelBuilder.Query<ResultType>();

и, наконец,

db.Query<ResultType>().FromSql(...)

Обратите внимание, что Database.ExecuteSqlCommand может выполнять произвольный SQL, но не может использоваться для возврата последовательности (IEnumerable<T>, IQueryable<T>).

0 голосов
/ 28 ноября 2018

Вы можете использовать Database.SqlQuery() непосредственно для контекста.

Здесь я создаю обобщенную функцию, которая может выполнять ваш запрос непосредственно с целью к базе данных, а не с сущностью.

public static List<T> Execute<T>(MyDbContext context, string query) where T : class
{
    var result = context.Database
                        .SqlQuery<T>(query)
                        .ToList();

    return result;
}

Вы можетеиспользуйте вышеуказанную функцию как

var blogs = Execute<Blog>(context, "SELECT * FROM dbo.Blogs");
0 голосов
/ 28 ноября 2018

Вы можете использовать context.Database.ExecuteSqlCommand() для выполнения sql.

Если вы хотите использовать SqlCommand, вы можете получить соединение по

var cnn = (SqlConnection) context.Database.GetDbConnection();
cnn.Open();
using (var cmd = new SqlCommand(sql, cnn))
using (var rdr = cmd.ExecuteReader(CommandBehavior.SingleResult))
...