Необработанный запрос с предложением IN при использовании ядра EF - PullRequest
0 голосов
/ 24 декабря 2018

Во-первых, извините, потому что мой англ не хорош.И у меня есть проблема с моим запросом, использующим базовый необработанный запрос EF

SELECT * FROM [Iot.Core].[dbo].[LocaleResources] WHERE [Key] IN ({0})

, и я хочу передать строку списка в качестве параметра

var inClause = new List<string>() { "Apple", "Banana", "Cream"};

Но результат возврата DbContext неверен.

dbContext_LocaleResources.FromSql(_querySelectLocaleResourceByKeyAndLanguage, inClause).ToList()

Пожалуйста, помогите!Спасибо тебе

1 Ответ

0 голосов
/ 25 декабря 2018

У вас неправильный формат данных inClause для замены заполнителя.Я выясняю способ использования RawSQL с предложением IN с помощью RawSqlString.

  List<string> list = new List<string>()
        {
            "Apple",
            "Banana",
            "Cream"
        };
        StringBuilder sb = new StringBuilder();
        list.ForEach((item) =>
        {
            sb.Append("'");
            sb.Append(item);
            sb.Append("'");
            sb.Append(",");
        });
        sb.Remove(sb.Length - 1, 1);//{'Apple','Banana','Cream'}

        RawSqlString raw = new RawSqlString($"select * from Customer where Name in ({sb.ToString()})");
        var result = _context.Customers.FromSql(raw).ToList();

Обновление:

У него всегда будет предупреждение, если вы хотите передать список строк вIN.

Выражение SQL, переданное FromSql, встраивает данные, которые не будут параметризованы.Обзор потенциальной уязвимости внедрения SQL

Обходной путь использует Or вместо IN

List<string> list = new List<string>()
        {
            "Apple",
            "Banana",
            "Cream"
        };
        StringBuilder sb = new StringBuilder();
        sb.Append("select * from Customer where "); 
        list.ForEach((item) =>
        {
            sb.Append("Name='");
            sb.Append(item);
            sb.Append("' Or ");
        });
        sb.Remove(sb.Length - 4, 4);
        RawSqlString sql= new RawSqlString(sb.ToString());
        var result = _context.Customers.FromSql(sql).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...