使用LINQ表达式从Dictionary生成插入SQL查询

时间:2015-02-25 13:05:38

标签: c# vb.net linq linq-to-sql sql-server-2012

如果这个问题具有误导性,请道歉,但我会尽力解释我想要实现的目标。

我有一个包含以下值的字典

Dim myDictionary As New Dictionary(Of Integer, Integer)
myDictionary.Add(1, 100)
myDictionary.Add(2, 200)
myDictionary.Add(3, 300)
myDictionary.Add(4, 400)
myDictionary.Add(5, 500)
myDictionary.Add(6, 600)

我通过循环遍历Dictioanry来生成一些插入查询:

Dim s As String = String.Empty
For Each kvp As KeyValuePair(Of Integer, Integer)
    s &= "INSERT INTO myTable(id, qty) SELECT " & kvp.key & "," & kvp.value & ";" & vbCrLf
Next

Console.Write(s)

保存到我的String变量中的值如下:

INSERT INTO myTable(id, qty) SELECT 1, 100;
INSERT INTO myTable(id, qty) SELECT 2, 200;
INSERT INTO myTable(id, qty) SELECT 3, 300;
INSERT INTO myTable(id, qty) SELECT 4, 400;
INSERT INTO myTable(id, qty) SELECT 5, 500;
INSERT INTO myTable(id, qty) SELECT 6, 600;

然后,我将这些值插入数据库,如下所示:

myDb.ExecuteSQL(s)

我对上述内容感到满意,但我想探索/学习新方法。因此,我想知道是否有办法用LINQ表达式生成上述输出? 例如:将INSERT个查询保存到List(of String)

的表达式
Dim myList As New String(of String)
myList = <LINQ expression here>

所以,我可以使用以下内容在控制台上打印并插入我的数据库。

console.Write(String.Join(vbCrLf, myList.ToString()))
myDb.ExecuteSQL(String.Join(vbCrLf, myList.ToString()))

修改 我知道parameterized SQL用法,SQL Injection等,我一直在我的项目中使用它们。上面的例子只是为了简单起见并解释我想要实现的目标。 我很想知道是否有办法与LINQ实现相同(它不一定需要更清洁),谢谢。

1 个答案:

答案 0 :(得分:2)

  

f有没有办法用LINQ表达式产生上述输出?

是的,但不一定更清洁。

类似的东西,在C#中(因为VB lambdas看起来很可怕)

// Get IEnum<string>, one SQL command per string
// NB. enumerating a dictionary gives IEnum<KeyValuePair<TKey, TVal>>
var exprs = myDictionary.Select(kv =>
                // Build SQL
            );

var cmdStr = String.Join("\r\n", exprs);

然而这是 BAD 。您应该使用参数将值传递给数据库,以帮助避免SQL注入漏洞。

循环更容易:

var params = new List<DbParameter>();
int nParam = 0;
var sb = new StringBuider();

foreach (var kv in myDictionary) {
  sb.AppendFormat("INSERT INTO myTable(id, qty) values (@p{0}, @p{1})",
                  nParam, nParam+1);
  sb.AppendLine();
  params.Add(MakeDbParam("@p" + nParam.ToString(), kv.Key);
  params.Add(MakeDbParam("@p" + (nParam+1).ToString(), kv.Value);
  nParam +=2
}

然后在执行命令时包含参数集合。