Member 14615490 Ответов: 3

Entity framework core - select query (executesqlinterpolated)


Привет

Я пытаюсь получить значение столбца с помощью sql select query из базы данных в entity framework core. Не знаю, что я здесь делаю не так. Я не хочу, чтобы таблицы преобразовывались в модели при использовании ядра Entity Framework в решении.

Этот запрос является одноразовым запросом.

Спасибо и с уважением,
Швета

Что я уже пробовал:

var itemNo = "105744";

var myCommand = $"select MD.size from tbl_Stock_Master_data MD inner join tbl_StockGroupMaster on StkGrpID = ItemGroupID LEFT JOIN tbl_StockSizeOrdering O ON MD.SIZE = O.Size where itemno = '{itemNo}'";
                var size = motherLoadContext.Database.ExecuteSqlInterpolated(myCommand);

Wendelius

В чем проблема, вы получаете сообщение об ошибке или какую-то другую проблему?

3 Ответов

Рейтинг:
9

Member 14615490

using (var command = motherLoadContext.Database.GetDbConnection().CreateCommand())
                {
                    command.CommandText = string.Format("select Colour from tbl_Stock_Master_data MD inner join tbl_StockGroupMaster on StkGrpID = ItemGroupID LEFT JOIN tbl_StockSizeOrdering O ON MD.SIZE = O.Size where itemno = '{0}'",itemNo);
                    motherLoadContext.Database.OpenConnection();
                    using (var result = command.ExecuteReader())
                    {
                        if (result.HasRows)
                        {
                            while (result.Read())
                            {
                                colour = result.GetString(0);
                            }
                        }
                    }
                }

This is the way we need to read a select statement. 


Richard Deeming

Молодец - ты только что доказал, что ОРМ не делает тебя невосприимчивым к SQL-инъекция[^]. 🤦‍♂️

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

С помощью ExecuteSqlInterpolated это правильный способ сделать это в ядре EF.

Рейтинг:
2

Richard Deeming

ExecuteSqlInterpolated[^] ожидает, что параметр будет равен a FormattableString[^].

К сожалению, используя var с помощью интерполированной строки создается string вместо этого переменная. Значения параметров будут введены непосредственно в результирующую строку, и вы оставите себя открытым для SQL-инъекции. К счастью, вместо этого вы получаете ошибку компилятора: cannot convert from 'string' to 'System.FormattableString'.

Вам также нужно будет удалить одинарные кавычки со всего {itemNo} заполнитель. EF будет использовать правильно параметризованный запрос, поэтому этот заполнитель будет заменен именем параметра. Вам не нужны кавычки, когда вы используете параметры.

Вы можете либо объявить тип переменной явно:

FormattableString myCommand = $"select MD.size from tbl_Stock_Master_data MD inner join tbl_StockGroupMaster on StkGrpID = ItemGroupID LEFT JOIN tbl_StockSizeOrdering O ON MD.SIZE = O.Size where itemno = {itemNo}";

var size = motherLoadContext.Database.ExecuteSqlInterpolated(myCommand);
или встроить переменную запроса:
var size = motherLoadContext.Database.ExecuteSqlInterpolated($"select MD.size from tbl_Stock_Master_data MD inner join tbl_StockGroupMaster on StkGrpID = ItemGroupID LEFT JOIN tbl_StockSizeOrdering O ON MD.SIZE = O.Size where itemno = {itemNo}");


Рейтинг:
0

Wendelius

Скорее всего проблема возникает из-за того, что ExecuteSqlInterpolated заменяет переменные параметрами. В вашем случае параметр будет находиться внутри кавычек, и это, вероятно, вызывает проблему.

Попробуйте что - нибудь вроде

var myCommand = $@"SELECT MD.size 
FROM tbl_Stock_Master_data MD 
INNER JOIN tbl_StockGroupMaster on StkGrpID = ItemGroupID 
LEFT JOIN tbl_StockSizeOrdering O ON MD.SIZE = O.Size 
WHERE itemno = {itemNo}";

var size = motherLoadContext.Database.ExecuteSqlInterpolated(myCommand);

Кроме того, в столбце в предложении where отсутствует псевдоним таблицы, поэтому обязательно включите его, чтобы предотвратить неоднозначные имена. Что-то вроде
WHERE md.itemno = {itemNo}"