错误CS1977:不能将lambda表达式用作动态分派操作的参数

时间:2017-07-24 15:52:52

标签: c# json vb.net dynamic lambda

我已经将一些代码从vb.net转换为c#但是它遇到了lambda的问题。

错误CS1977:如果没有首先将lambda表达式转换为委托或表达式树类型,则不能将lambda表达式用作动态调度操作的参数。

这是翻译过的代码..

Animal

2 个答案:

答案 0 :(得分:1)

使用foreach并创建参数化SqlCommand是最佳做法

var ds = (JArray)o["Tables"][0]["Rows"];

using (var connection = new SqlConnection(cnnString)) {
    connection.Open();
    var cmdIns = new SqlCommand("INSERT INTO dbo.AddPlay(UserId, Timestamp, YoutubeId, Source, PlayCount, Rating) VALUES(@UserId, @Timestamp, @YoutubeId, @Source, @PlayCount, @Rating)", connection);
    cmdIns.Parameters.Add("@UserId", SqlDbType.VarChar, 20);
    cmdIns.Parameters.Add("@Timestamp", SqlDbType.VarChar, 20);
    cmdIns.Parameters.Add("@YoutubeId", SqlDbType.VarChar, 20);
    cmdIns.Parameters.Add("@Source", SqlDbType.VarChar, 20);
    cmdIns.Parameters.Add("@PlayCount", SqlDbType.Int);
    cmdIns.Parameters.Add("@Rating", SqlDbType.Int);

    foreach (var ja in ds) {
        cmdIns.Parameters["@UserId"].Value = ja(0).Value<string>();
        cmdIns.Parameters["@Timestamp"].Value = ja(1).Value<string>();
        cmdIns.Parameters["@YoutubeId"].Value = ja(2).Value<string>();
        cmdIns.Parameters["@Source"].Value = ja(3).Value<string>();
        cmdIns.Parameters["@PlayCount"].Value = GetInt(ja(4));
        cmdIns.Parameters["@Rating"].Value = GetInt(ja(5));

        cmdIns.ExecuteNonQuery();
    }
}

答案 1 :(得分:0)

dynamic导致在运行时而不是编译时确定变量类型,这对lambda表达式不起作用。但是你不需要动态变量;你已经知道类型是JArray,因为你正在进行演员表演。因此,将变量声明从dynamic更改为JArray,这将修复编译器错误:

JArray ds = (JArray)o["Tables"][0]["Rows"];

您的代码有其他问题:

  • SqlConnection不包含Execute方法。您需要创建SqlCommand并使用其ExecuteNonQuery方法进行插入。
  • 您的SQL无法按预期工作,因为您实际上并未将JArray的值放入命令字符串中。无论如何你应该使用SQL参数。

请参阅@NetMage's answer,了解如何解决这些问题。