C# 警告EF1000。在“中写入参数的最佳方式是什么?”;在;陈述

C# 警告EF1000。在“中写入参数的最佳方式是什么?”;在;陈述,c#,sql,linq,asp.net-core-2.1,ef-core-2.1,C#,Sql,Linq,Asp.net Core 2.1,Ef Core 2.1,EF Core 2.1抛出有关SQL注入的警告。这是我的代码片段 var query = await _ctx.Set<TABLE>() .FromSql("Select * from TABLE where Artikelnummer IN (" + string.Join(',', artNum) + ")") .AsNoTracking() .Se

EF Core 2.1抛出有关SQL注入的警告。这是我的代码片段

var query = await _ctx.Set<TABLE>()
                      .FromSql("Select * from TABLE where Artikelnummer IN (" + string.Join(',', artNum) + ")")
                      .AsNoTracking()
                      .Select(z => new
                      {
                        z.Artikelnummer,
                        z.Property
                      }).ToArrayAsync();
但是我有比这个更大、更复杂的查询,所以在这种情况下LINQ对实体是不好的。 应该是这样的,问题是如何重写此查询以避免出现警告

LINQtoEntities的执行时间比LINQtoSQL长得多,所以这不是解决我的问题的合适方法


我调查了连接会导致警告,所以应该有没有连接的解决方案。

我似乎在EF核心文档中找不到这样的警告。有趣的是,EF Core 2.1查询转换器本身并没有在values子句中参数化生成的SQL
。如果将查询的
.FromSql
行替换为

.Where(x => artNum.Contains(x.Artikelnummer)
顺便说一句,哪个LINQ to Entities相当于您的查询,它可以很好地进行翻译和执行,所以我不知道在这种特殊情况下,您为什么要使用
FromSql

但是无论如何,您可以通过在sql字符串中包含
{0}
{1}
等占位符来参数化查询,并通过
参数params object[]parameters
传递值:

与任何接受SQL的API一样,参数化任何用户输入以防止SQL注入攻击非常重要。您可以在SQL查询字符串中包含参数占位符,然后将参数值作为附加参数提供。您提供的任何参数值都将自动转换为DbParameter

在您的情况下,可能是这样的:

var placeholders = string.Join(",", atrNum.Select((v, i) => "{" + i + "}"));
var values = atrNum.Cast<object>().ToArray();

.FromSql("Select * from TABLE where Artikelnummer IN (" + placeholders + ")", values)
var占位符=string.Join(“,”,atrNum.Select((v,i)=>“{+i+”}”);
var值=atrNum.Cast().ToArray();
.FromSql(“从ArtikerNummer所在的表(“+占位符+”)中选择*”,值)

SQL注入的定义非常明确。我想这里提到的其中一种方法应该也适用于
IEnumerable
s。没有任何方法可以解决我的问题,因为每次都出现单引号。您是否尝试过使用类似
\u ctx.Set()。其中(x=>artNum.Contains(x.Artikelnummer))。AsNoTracking()…等的方法?
?警告不是错误。如果要查看代码以确保实际上不存在SQL注入漏洞,则可以抑制或忽略该警告。在这里,由于您连接的是
int
列表,而不是
string
,因此您不会受到SQL注入的影响。FromSql中的连接会引起警告。
FromSql
方法的第一个参数基本上是string,我不知道您所说的连接是什么,方法实现无法知道字符串是硬编码的还是通过连接多个字符串生成的。你究竟是如何“研究级联引起警告”的?我尝试使用级联和单字符串,只有在第二种情况下,我才能看到在查询中引起的警告。根据问题的当前代码,无论答案中是否建议使用技巧,我都不会得到任何警告。顺便说一句,我想我们谈论的是Visual Studio,而不是像Resharper或类似的第三方扩展?您是否收到编译时或*运行时警告?你能发布一个截图吗?如果使用变量,也会发生什么情况,例如,
var sql=“Select*from TABLE where Artikelnummer IN”(“+占位符+”)
然后
.FromSql(sql,values)
(或者使用来自变量的串联字符串来激活原始查询)?
var placeholders = string.Join(",", atrNum.Select((v, i) => "{" + i + "}"));
var values = atrNum.Cast<object>().ToArray();

.FromSql("Select * from TABLE where Artikelnummer IN (" + placeholders + ")", values)