SqlParameter:Resharper中的格式字符串中未使用参数

Fel*_*eza 2 c# resharper entity-framework-core

在我的VS 2017上安装Resharper后,我在SqlParameter参数上有这个警告.

格式字符串中不使用参数

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

resharper向我提出的解决方案是删除多余的论点.

var children = context.FluxoHierarchy
    .FromSql("get_children_fluxo_closure @node_id").ToList();
Run Code Online (Sandbox Code Playgroud)

我的代码有问题吗?

Evk*_*Evk 7

此警告的原因是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)
Run Code Online (Sandbox Code Playgroud)

sql格式模式在哪里,并且parameters是格式字符串的参数,正如Resharper认为的那样,因为上面的属性.

然后ReSharper的看到你没有在你的格式字符串的任何位置参数(位置参数是一样{0},{1}等等-你会使用String.Format),并看到你传递一个参数.它正确(因为属性)认为这个参数是无用的,因为格式字符串不包含任何占位符.它希望你会像这样使用它(比如String.Format):

FromSql("get_children_fluxo_closure {0}", 1).ToList();
Run Code Online (Sandbox Code Playgroud)

这也是有效的用法(EF Core会将其转换1为参数并替换它,因此它不是SQL注入).

但是如您所知,这种方法支持另一种传递参数的方法,一种是您正在使用的方法.但是,Resharper无从得知这一点.方法用StringFormatMethod属性和Resharper 修饰,再次正确,假设它总是像这样使用.

所以这个问题不在Resharper方面,而是在EF Core方面,因为混合不同的传递参数的方式,然后用属性强制Resharper认为只有一个是有效的装饰方法不是一个好主意.那时最好不要标记它.

要解决方法,您可以使用"字符串格式"方式传递参数,如上所示,但这当然并不总是令人满意.您可以通过将查询移动到单独的变量或执行以下操作来阻止Resharper分析此表达式:

FromSql(new RawSqlString("get_children_fluxo_closure @node_id"), new SqlParameter("@node_id", 1)).ToList();
Run Code Online (Sandbox Code Playgroud)

或者通过评论禁用警告:

// ReSharper disable once FormatStringProblem
FromSql("get_children_fluxo_closure @node_id", new SqlParameter("@node_id", 1)).ToList();
Run Code Online (Sandbox Code Playgroud)

但这一切都很难看.Real Soltuion在EF Core github跟踪器上打开了一个问题并要求他们修复它.

  • 并且分辨率**将不会修复**因为*"在使用@语法的情况下,确定常见情况的属性值超过了假阴性."* (2认同)