为动态类型创建异步和并行进程

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

我有一个反序列化的 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 循环它们。

c# multithreading asynchronous asp.net-core-mvc
1个回答
1
投票

您尝试使用的

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

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