ASP. NET core получает количество из таблицы с использованием необработанных запросов - PullRequest
0 голосов
/ 16 апреля 2020

Как запустить необработанный запрос в ядре ASP. NET, чтобы получить количество строк из таблицы.

В настоящее время я делаю это, и возвращаемый результат равен -1. Я думаю, что возвращаемый результат основан на количестве затронутых записей.

 int numberOfRows = await
                    appDbContext.Database.ExecuteSqlInterpolatedAsync(
                        $"SELECT CODE FROM [samaster] WHERE CODE={productBrandCode} AND WAREHOUSE={warehouse} ")
                ;

Любая идея о том, как вернуть счет в переменную numberOfRows, будет оценена.

ПРИМЕЧАНИЕ. Приведенная выше таблица не является моделью, поэтому мне нужно выполнить необработанный запрос. Спасибо

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

В настоящее время невозможно получить результат запроса при использовании ExecuteSqlInterpolatedAsyn c. То же относится и к любым дополнительным операторам LINQ.

Однако вы можете использовать базовый ADO. net Provider:

    public IList<IDictionary<string, dynamic>> SelectDynamic(string table)
    {
        using (var command = Database.GetDbConnection().CreateCommand())
        {
            command.CommandText = $"SELECT * FROM [{table}]";
            command.CommandType = CommandType.Text;

            Database.OpenConnection();

            using (var result = command.ExecuteReader())
            {
                var entities = new List<IDictionary<string, dynamic>>();

                while (result.Read())
                {
                    var dict = new Dictionary<string, dynamic>();

                    for (int i = 0; i < result.FieldCount; i++)
                    {
                        dict.Add(result.GetName(i), result.GetValue(i));
                    }

                    entities.Add(dict);
                }

                return entities;
            }
        }
    }

Добавьте это в свой класс DbContext и вызовите его с помощью:

using (var context = new MyDbContext()) // Or get it with DI, depends on your application
{
     var count = context.SelectDynamic("samaster").Where(d => d["CODE"] == productBrandCode && d["WAREHOUSE"] == warehouse).Count();
}

Остерегайтесь, однако, это дорогостоящая операция, если в вашей таблице много строк! Альтернативный подход для извлечения только релевантных результатов состоит в замене

command.CommandText = $"SELECT * FROM [{table}]";

на

command.CommandText = $"SELECT CODE FROM [samaster] WHERE CODE={productBrandCode} AND WAREHOUSE={warehouse}";

и передаче параметров в качестве параметров функции.

public IList<IDictionary<string, dynamic>> SelectDynamic(string productBrandCode, string warehouse)
    {...

Также убедитесь, что экранированы все параметры, если они каким-либо образом представлены пользовательским вводом, чтобы предотвратить SQL Атаки с помощью инъекций!

0 голосов
/ 01 мая 2020

Так как никто не дал мне правильный ответ. В итоге я использую следующее.

public async Task<bool> IsAValidProduct(string productBrandCode)
        {
            int count = 0;
            await using DbCommand command = appDbContext.Database.GetDbConnection().CreateCommand();
            command.CommandText =
                "SELECT COUNT(CODE) FROM [samaster] WHERE CODE=@productBrandCode AND WAREHOUSE=@warehouse ";
            command.CommandType = CommandType.Text;
            command.Parameters.Add(new SqlParameter("@productBrandCode", SqlDbType.VarChar)
                {Value = productBrandCode});

            command.Parameters.Add(new SqlParameter("@warehouse", SqlDbType.VarChar)
                {Value = warehouse});
            await appDbContext.Database.OpenConnectionAsync();

            count = (int) await command.ExecuteScalarAsync();

            await appDbContext.Database.CloseConnectionAsync();
            return count == 1;
        }
0 голосов
/ 16 апреля 2020

Существует два общих подхода:

A.

int numberOfRows = await appDbContext.Database.ExecuteSqlInterpolatedAsync($"SELECT CODE FROM [samaster] WHERE CODE={productBrandCode} AND WAREHOUSE={warehouse} ").Count();

B.

int numberOfRows = await appDbContext.Database.ExecuteSqlInterpolatedAsync($"SELECT count(*) FROM [samaster] WHERE CODE={productBrandCode} AND WAREHOUSE={warehouse} ").First();
...