我正在嘗試將使用 EF Core 的 .FromSqlRaw() 方法運行的 sql 查詢轉換為使用 .FromSqlInterpolated() 運行的查詢,以便它們不易受到 SQL 注入攻擊。我已經轉換了幾乎所有內容并且作業正常,但是讓我感到困惑的一件事是如何在單個欄位的 or 配置中按整數串列進行過濾。資料庫是 postgres,引號是因為我首先使用了 EF Core 代碼,這意味著所有表都像類一樣大寫。ProjectTypeId 是我表中的整數列,projectTypes 是List<int>型別變數。
我要替換的 where 子句中的代碼是:
WHERE ""PartGroups"".""ProjectTypeId"" IN({string.Join(",", projectTypes)})
我能夠讓它作業的最接近的是這個:
""PartGroups"".""ProjectTypeId""::text IN({string.Join(",", projectType)})
或者
""PartGroups"".""ProjectTypeId""::text LIKE ANY(ARRAY[{string.Join(",", projectTypes)}])
當 projectTypes 中只有一個值時,這些將起作用,但超過這個值就會失敗。我不知道如何查看生成的查詢 引數集,只是查詢,所以我不確定它對引數做了什么,所以我一直在努力找出可行的方法。此外,該查詢總共有約 80 個引數,因此使用原始查詢手動設定每個引數實際上并不可行。
uj5u.com熱心網友回復:
您可能可以采用的一種方法是利用 EF 的能力在原始資料的頂部進行組合
context.SomeTable
.From..($"SELECT t.* FROM ...")
.Where(st => idList.Contains(st.id))
EF 會將您的 SQL 作為子查詢放入,并在外部為您撰寫 IN。如果可以的話,DB 查詢優化器將(可能)然后將 IN 推入子查詢中。
uj5u.com熱心網友回復:
您可以做的另一件事是自己在 FormattableString 中創建查詢。只要 FromSqlInterpolated 收到一個 FormattableString ,它就會把它拆開并引數化
var args = new object[] { your, single, arguments, here}.Concat(yourListOfThingsHere.Cast<object>()).ToArray();
var fs = FormattableStringFactory.Create(@"SELECT
some,
columns/{0},
here
FROM
table t
WHERE
someColumn = {1} AND
otherColumn BETWEEN {2} and {3} AND
columnToBeINned IN({" string.Join("},{", Enumerable.Range(4, yourListOfThingsHere.Count)) @"})
GROUP BY some, columns/{0}", args);
var qq = context.Table.FromSqlInterpolated(fs).Where(m => ...);
當然,可以撰寫一個助手來為您執行此操作...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383290.html
標籤:C# 网站 。网 PostgreSQL的 实体框架核心
