Причиной этого предупреждения является 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, и попросите ее исправить.