由于EF Core当前不在数据库中执行按组查询,因此我使用以下查询来完成工作(InvoiceQuery
是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();
上面的代码运行完美,但是我不喜欢它,因为它给了我一个“可能的SQL注入漏洞”的警告。正在使用)。
我尝试传递查询并将参数提供给#pragma
方法,该方法可以工作,但是FromSql
子句中输入的参数未正确映射。.
尝试使用IN
,但是没有用。
任何帮助将不胜感激
答案 0 :(得分:0)
从EF Core 2.0开始,您可以使用FormattableString,在其中可以将字符串插值用于查询。
String interpolation in FromSql and ExecuteSqlCommand
FormattableString Class
在EF Core 2.0中,我们向接受原始SQL字符串的两个主要API添加了对插值字符串的特殊支持:
FromSql
和ExecuteSqlCommand
。这种新的支持使C#字符串插值能够以“安全”的方式使用。
文档中的示例:
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();
}
这将产生:
@p0='London' (Size = 4000)
@p1='Sales Representative' (Size = 4000)
SELECT *
FROM ""Customers""
WHERE ""City"" = @p0
AND ""ContactTitle"" = @p1