我有一个反序列化的 JSON 数组,我想循环遍历并调用一些查询并复制 OneDrive 中的一些文件。我可以手动循环遍历每个,但我也想看看是否可以获得任务可等待版本设置。我已经在下面写了,但我遇到了第二种方法的错误:
var parentJSON = JsonConvert.DeserializeObject<dynamic>(ParentJSON);
var childrenJSON = JsonConvert.DeserializeObject<dynamic>(ChildrenJSON);
using (var connection = new SqlConnection(connectionString))
{
foreach(var childReview in childrenJSON)
{
var ParentID = (int)parentJSON.ID;
var ChildID = (int)childReview.ID;
var queryResult = connection.QuerySingle(query, new { Parent = ParentID, Child = ChildID });
var path = Path.Combine(fileDirectory, queryResult.CHILD_PATH);
DriveItem FolderInfo = await oneDrive.DriveItemInfoAsync(SharedDriveID, path, "path");
var CopiedDriveItem = await oneDrive.CopyFileAsync(SharedDriveID, path, "path", queryResult.CHILD_FILENAME, FolderInfo.Id);
}
}
var tasks = childrenJSON.Select(async file => {
var ParentID = (int)parentJSON.ID;
var ChildID = (int)file.ID;
using (var connection = new SqlConnection(connectionString))
{
var queryResult = connection.QuerySingle(query, new { Parent = ParentID, Child = ChildID });
var path = Path.Combine(fileDirectory, queryResult.CHILD_PATH);
DriveItem FolderInfo = await oneDrive.DriveItemInfoAsync(SharedDriveID, path, "path");
var CopiedDriveItem = await oneDrive.CopyFileAsync(SharedDriveID, path, "path", queryResult.CHILD_FILENAME, FolderInfo.Id);
}
});
错误是:
CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type.
如果我要将序列化查询结果绑定到模型,我知道我可以使用此任务等待方法,但是使用反序列化 JSON 的动态转换会导致此错误。我该如何解决这个问题?我不确定应该如何转换它,以及为什么它对动态类型如此严格,尽管您可以 foreach 循环它们。
您尝试使用的
Select()
方法是 Enumerable.Select
。但是,编译器不会使用它,因为 ChildrenJSON
是 dynamic
。相反,编译器假设这个未知的 dynamic
对象在运行时将有一个 Select()
方法。该错误并非特定于使用 Select()
- 如果您以 lambda 作为参数调用 dynamic
上的任何方法,就会发生这种情况。例如,childrenJSON.Blah(i => {})
会产生相同的编译器错误。
如果
ChildrenJSON
是一个JSON数组,则将其反序列化为IEnumerable<dynamic>
:
var childrenJSON = JsonConvert.DeserializeObject<IEnumerable<dynamic>>(ChildrenJSON);
当您调用
.Select()
时,它将使用 Enumerable.Select
。