Как выполнить RAW SQL Query с EF Core? - PullRequest
0 голосов
/ 21 апреля 2019

В основном у меня проблема в том, что я хочу выполнить запрос в базе данных, который не является представлением моей модели.

Это мой код для создания соединения с другой базой данных:

public static OtherContext GetNewContextGeneric(string connectionString)
        {
            var builder = new DbContextOptionsBuilder();
            builder.UseSqlServer(connectionString);

            OtherContext db = new OtherContext(builder.Options);

            return db;
        }

И вот мой код для выполнения запроса:

public List<IQueryble> Query (string connectionString, string query)
        {
            try
            {
                using(var contextGeneric = ContextFactory.GetNewContextGeneric(connectionString))
                {
                    //I want something like this
                    return contextGeneric.Query(query).ToList();
                }
            }
            catch(System.Data.SqlClient.SqlException ex)
            {
                throw new SQLIncorrectException(ex);
            }
            catch(System.InvalidOperationException ex)
            {
                throw new NotImplementedException();
            }   
        }

Может ли кто-нибудь мне помочь?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2019

В вопросе, который вы говорите:

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

и затем в комментариях вы добавляете:

Поскольку я не знаю, как создается база данных, я не знаю, какие таблицы находятся в базе данных, я хочу вставить SQL-запрос

Что ж, если вы не знаете базу данных, то вы не можете использовать Entity Framework, поскольку она требует подробного знания базы данных, к которой вы подключаетесь.
Вы должны использовать обычный ADO.NET (или Dapper , если вы хотите отобразить результаты обратно в известный класс) для этого.

1 голос
/ 21 апреля 2019

Вы можете использовать DbDataReader:

using (var command = context.Database.GetDbConnection().CreateCommand())
{
    command.CommandText = "SELECT * From Make";
    context.Database.OpenConnection();
    using (var reader = command.ExecuteReader())
    {
        // Do something with result
        reader.Read(); // Read first row
        var firstColumnObject = reader.GetValue(0);
        var secondColumnObject = reader.GetValue(1);

        reader.Read(); // Read second row
        firstColumnObject = reader.GetValue(0);
        secondColumnObject = reader.GetValue(1);
    }
}

Здесь вы можете узнать больше о том, как читать значения из DbDataReader.

В качестве альтернативы вы можете использовать FromSql() метод, но он работает только для предопределенного DbSet некоторого объекта, что не является тем решением, которое вы хотели.

0 голосов
/ 21 апреля 2019

Работало так:

private void SqlCommand (string connectionString, string query)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlCommand command = new SqlCommand(query, connection);
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
                try
                {
                    while (reader.Read())
                    {
                        var a = reader[0];
                    }
                }
                finally
                {
                    // Always call Close when done reading.
                    reader.Close();
                }
            }
        }

Или

using (var connection = ContextFactory.GetNewContextGeneric(connectionString).Database.GetDbConnection())
                {
                    connection.Open();
                    DbCommand command = connection.CreateCommand();
                    command.CommandText = query;

                    using (var reader = command.ExecuteReader())
                    {
                        // Do something with result
                        reader.Read(); // Read first row
                        var firstColumnObject = reader.GetValue(0);
                        /*var secondColumnObject = reader.GetValue(1);

                        reader.Read(); // Read second row
                        firstColumnObject = reader.GetValue(0);
                        secondColumnObject = reader.GetValue(1);*/
                        connection.Close();
                        return firstColumnObject.ToString();
                    }
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...