错误 CS1977:无法使用 lambda 表达式作为动态分派操作的参数

问题描述 投票:0回答:3

我已将一些代码从 vb.net 转换为 C#,但 lambda 存在问题。

错误 CS1977:如果不先将 lambda 表达式强制转换为委托或表达式树类型,则无法将其用作动态分派操作的参数。

这是翻译后的代码..

dynamic ds = (JArray)o["Tables"][0]["Rows"];
using(var connection = new SqlConnection(cnnString))
    {connection.Open();
     ds.Select(ja =>
        connection.Execute("INSERT INTO dbo.AddPlay(UserId, Timestamp, YoutubeId, Source, PlayCount, Rating) " + 
                " VALUES(ja(0).Value<string>(), ja(1).Value<string>() ja(2).Value<string>(), ja(3).Value<string>(), GetInt(ja(4)), GetInt(ja(5)))"));
    }
c# json vb.net dynamic lambda
3个回答
3
投票

使用

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();
    }
}

3
投票

dynamic
导致变量类型在运行时而不是编译时确定,这与 lambda 表达式配合不佳。 但这里不需要动态变量;你已经知道类型是
JArray
因为你正在进行强制转换。 因此,将变量声明从
dynamic
更改为
JArray
,这将修复编译器错误:

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

但是您的代码还有其他问题:

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

请参阅 @NetMage 的回答,了解如何解决这些问题。


0
投票

虽然其他答案适用于这种情况,甚至是首选,但这通常适用于 CS1977:

在 lambda 中添加强制转换,

从此:

ds.Select(ja => ...);

对此:

ds.Select((Func<object, object>) (ja => ...));

我认为

Func<object, object>
在这里是正确的正确类型

© www.soinside.com 2019 - 2024. All rights reserved.