Poiché EF Core non esegue attualmente il gruppo in base alle query nel database, sto utilizzando la seguente query per completare il lavoro ( InvoiceQuery
è un tipo DbQuery
):
long merchantId = 177;
var invTokens = new List<string> {"qasas", "efsac"};
string inClause = string.Join(",", invTokens);
string query = $@"SELECT i.Token, i.Balance, COALESCE(SUM(i.Amount), 0) AS ProcessingAmount
FROM inv.Invoices i
WHERE i.Token IN ({inClause})
AND i.MerchantId = {merchantId}
AND i.Status = {(int)InvoiceStatus.Scheduled}
GROUP BY i.Token, i.Balance";
return await dbContext.InvoicesQuery.FromSql(query).ToListAsync();
Il codice sopra funziona perfettamente, ma non mi piace perché mi dà un avvertimento di una "possibile vulnerabilità nell'iniezione SQL". So che posso usare un #pragma
per sopprimere questo avviso (è quello che sto attualmente usando).
Ho provato a passare la query e fornire i parametri al metodo FromSql
e funziona, ma il parametro che va nella clausola IN
non viene mappato correttamente.
$"'{string.Join("', '", invTokens)}'"
provato usando $"'{string.Join("', '", invTokens)}'"
ma non ha funzionato.
Qualsiasi aiuto sarebbe apprezzato
Da EF Core 2.0, è possibile utilizzare un FormattableString, in cui è possibile utilizzare l'interpolazione di stringhe per le query.
Interpolazione di stringhe in FromSql ed ExecuteSqlCommand
Classe FormattableString
In EF Core 2.0 abbiamo aggiunto un supporto speciale per le stringhe interpolate alle nostre due API primarie che accettano stringhe SQL non
FromSql
:FromSql
edExecuteSqlCommand
. Questo nuovo supporto consente di utilizzare l'interpolazione di stringhe C # in modo "sicuro".
L'esempio dai documenti:
var city = "London";
var contactTitle = "Sales Representative";
using (var context = CreateContext())
{
context.Set<Customer>()
.FromSql($@"
SELECT *
FROM ""Customers""
WHERE ""City"" = {city} AND
""ContactTitle"" = {contactTitle}")
.ToArray();
}
Questo produrrà:
@p0='London' (Size = 4000)
@p1='Sales Representative' (Size = 4000)
SELECT *
FROM ""Customers""
WHERE ""City"" = @p0
AND ""ContactTitle"" = @p1