SqlParameter: аргумент не используется в строке формата из Resharper - PullRequest
0 голосов
/ 14 мая 2018

После установки Resharper на моем VS 2017 у меня появляется это предупреждение в аргументе SqlParameter.

Аргумент не используется в строке формата

var children = context.FluxoHierarchy
    .FromSql("get_children_fluxo_closure @node_id", new SqlParameter("@node_id", queueItem.ProximoNode)).ToList();

Решение, которое мне предлагает resharper, состоит в том, чтобы удалить лишний аргумент.

var children = context.FluxoHierarchy
    .FromSql("get_children_fluxo_closure @node_id").ToList();

Что-то не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Причиной этого предупреждения является FromSql используемая вами перегрузка, украшенная специальным атрибутом Resharper, StringFormatMethodAttribute . Этот атрибут

Указывает, что помеченный метод создает строку по шаблону формата и (необязательно) аргументы. Параметр, который содержит формат строка, должна быть указана в конструкторе. Строка формата должна быть в System.String.Format (System.IFormatProvider, System.String, System.Object []) - как форма.

Итак, FromSql подпись выглядит так:

[StringFormatMethod("sql")]
public static IQueryable<TEntity> FromSql<TEntity>(this IQueryable<TEntity> source, RawSqlString sql, params object[] parameters)

Где sql - это шаблон формата, а parameters - аргументы для форматирования строки, как считает Решарпер из-за вышеуказанного атрибута.

Затем Resharper видит, что в вашей строке формата нет позиционных параметров (позиционный параметр похож на {0}, {1} и т. Д. - что вы использовали бы для String.Format), и видит, что вы передаете аргумент , Он правильно (из-за атрибута) считает, что этот параметр бесполезен, потому что строка формата не содержит для него никакого заполнителя. Ожидается, что вы будете использовать его так (например, с String.Format):

FromSql("get_children_fluxo_closure {0}", 1).ToList();

И это также допустимое использование (EF Core преобразует это 1 в параметр и подставляет его, так что это не SQL-инъекция).

Но, как вы знаете, этот же метод поддерживает другой способ передачи параметров, который вы используете. Однако Решарпер не может этого знать. Метод украшен атрибутом StringFormatMethod, и Resharper, опять же правильно, предполагает, что он всегда используется следующим образом.

Так что эта проблема не на стороне Resharper, а на стороне EF Core, потому что смешивание различных способов передачи параметров, а затем декорирование метода с атрибутом, который заставляет Resharper думать, что только один является действительным, не очень хорошая идея. Тогда было бы лучше вообще не отмечать это.

В качестве обходного пути вы можете использовать способ передачи параметров в «строковом формате», как показано выше, но это, конечно, не всегда желательно. Вы можете запретить Resharper анализировать это выражение, переместив запрос в отдельную переменную или выполнив что-то вроде:

FromSql(new RawSqlString("get_children_fluxo_closure @node_id"), new SqlParameter("@node_id", 1)).ToList();

Или отключить предупреждение с комментарием:

// ReSharper disable once FormatStringProblem
FromSql("get_children_fluxo_closure @node_id", new SqlParameter("@node_id", 1)).ToList();

Но все это безобразно. Настоящее решение - открытая проблема на github-трекере EF Core, и попросите ее исправить.

0 голосов
/ 14 мая 2018

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

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

string query = "get_children_fluxo_closure @node_id";
var children = context.FluxoHierarchy
    .FromSql(query, new SqlParameter("@node_id", queueItem.ProximoNode))
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...