如何使用EF Core执行RAW SQL查询?

时间:2019-04-20 22:55:22

标签: c# asp.net-core entity-framework-core

基本上,我的问题是我想在数据库中运行查询,但这不是我的模型的代表。

这是我的代码,用于创建与另一个数据库的连接:

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 个答案:

答案 0 :(得分:2)

在问题中您说:

  

基本上,我的问题是我想在数据库中运行查询,但这不是我的模型的代表。

,然后在注释中添加:

  

因为我不知道如何创建数据库,所以我不知道数据库中要插入sql查询的表

好吧,如果您不知道数据库,则不能使用Entity Framework,因为它要求您对要连接的数据库有详细的了解。
为此,您应该使用普通的ADO.NET(如果要将结果映射回已知的类,请使用Dapper)。

答案 1 :(得分:1)

您可以使用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);
    }
}

Here,您可以了解更多有关如何从DbDataReader读取值的信息。

或者,您可以使用FromSql()方法,但这仅适用于某些实体的预定义DbSet,这不是您想要的解决方案。

答案 2 :(得分:-1)

它是这样工作的:

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();
                    }
                }