C# 将json对象反序列化到字典中,并用PK和值作为ExecutionTime填充键

C# 将json对象反序列化到字典中,并用PK和值作为ExecutionTime填充键,c#,asp.net-core,serialization,service,C#,Asp.net Core,Serialization,Service,这是我从API收到的模型 var query = FindBy(item => item.TaskEnabledStatus == trueOrFalse).Select(items => new MainGridDto() { PK_Task = items.PK_Task, TaskName = items.TaskName, TaskDescription = items.T

这是我从API收到的模型

        var query = FindBy(item => item.TaskEnabledStatus == trueOrFalse).Select(items => new MainGridDto()
        {
            PK_Task = items.PK_Task,
            TaskName = items.TaskName,
            TaskDescription = items.TaskDescription,
            TaskEnabledStatus = items.TaskEnabledStatus,
            BusinessName = items.tBusinessGroups.BusinessName,
            ExecutionTime = items.ExecutionTime.Value,
            BusinessGroupDto = new BusinessGroupDto()
            {
                PK_BusinessGroup = items.tBusinessGroups.PK_BusinessGroup,
                BusinessName = items.tBusinessGroups.BusinessName,
                BusinessGroupEnabledStatus = items.tBusinessGroups.BusinessGroupEnabledStatus
            },
            EmailBody = items.EmailBody,
            EmailSubject = items.EmailSubject,
            UserOwner = items.tUsers.tRecipients.FirstName + " " + items.tUsers.tRecipients.LastName,
            UsersDto = new UsersDto()
            {
                PK_User = items.tUsers.PK_User,
                UserName = items.tUsers.UserName,
                FirstAndLast = items.tUsers.tRecipients.FirstName + " " + items.tUsers.tRecipients.LastName
            },
            UserLastModified = items.tUsers.UserName,
            Frequency = items.Frequency,
            LastModifiedOn = items.LastModifiedOn
        });
我试图做的是将对象反序列化到字典中,但由于我的键为null,我不断地得到一个错误。如何将PK分配给字典,并将ExecutionTime作为值。或者甚至将索引指定给键和对象作为值?我让它处理一个列表,但我想把它改成一个字典,以提高搜索效率和性能

var model = JsonConvert.DeserializeObject<Dictionary<int, ReportInfoDto>>(dtoResponse.Result);
这就是我调用API并获得json响应和对象列表的方式

private HttpClient client;
client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:57595/");
var getAllReports = client.GetAsync("api/AllReports").Result;
    if (getAllReports.IsSuccessStatusCode)
                {

                    var dtoResponse = getAllReports.Content.ReadAsStringAsync();
                    dtoResponse.Wait();
                    var model = JsonConvert.DeserializeObject<Dictionary<int, ReportInfoDto>>(dtoResponse.Result, new KeyValuePairConverter());

                    var itemsToSendOut = from reports in model
                                         where reports.Value.ExecutionTimeFormatted  == DateTime.Now.ToString("hh:mm tt ")
                                         select reports;

因此,在您的示例中,如果您在评论中说:
我试图检查每个报告并查看它们的执行时间,那么听起来您想要的是:

Dictonary<DateTime, MyObject>
同样,如果有一种方法可以在一行
反序列化对象中实现所有这些,我很想知道。我看了看,什么地方都没看到。但这会让你得到你的字典,然后你可以快速方便地搜索执行时间

(作为旁注:这假设每个
执行时间都是唯一的。如果它们不是唯一的,它将不起作用。)

希望这有帮助

编辑:

你问:

另外,我正在使用linq查询搜索字典。这是一个好的做法还是有更有效的方法


通过值中的某个内容搜索字典实际上否定了字典提供的速度。如果这是你想要的,那么根本就不需要字典。字典的速度之所以快,是因为你可以通过键来搜索值。所以你可以做一个O(1)搜索。然而,如果你正在搜索一个列表(或一个字典的值),那么你在做一个O(n)搜索,其中n是列表或字典中项目的计数

请帮助我理解为什么要这样做:
我正在尝试将对象反序列化到字典中
。你说,
我让它处理一个列表,但我想把它改成一个字典,以提高搜索效率和性能。
。。您是否在列表中遇到性能问题?在我看来,您试图以一种不打算使用的方式使用字典。因此,我可能正在以一种糟糕的方式实现它,但我正在创建一个窗口服务,它将每分钟调用一个api以获取所有报告。然后,我尝试检查每个报告并查看它们的执行时间,以及它是否与机器当前时间匹配。我将向一些收件人发送一封包含报告的电子邮件。因此,我将不断地在字典中搜索,我的想法是,我可以使用字典并按值搜索,比如说12:00 am,我将在12:00获得所有需要发送的报告,而不是使用列表并逐个搜索。这是有道理的。所以当您调用API时,是否返回单个对象?还是一张物品清单?我这样问是因为我想知道为什么你不只是创建一个
字典
,然后使用
添加对象。添加
而不是尝试反序列化。在我尝试回答之前,我需要一些澄清。确切地说,
d响应结果是什么?它是一个单一的物体吗?或者一个对象列表?所以我得到的API响应是Http响应,根据我所知,需要序列化才能使用。(我将更新我的问题,说明如何调用API以及如何接收API)我可以序列化为列表,然后将其转换为字典。然而,我想也许有一种方法可以用字典来代替。是的,我也试着搜索了很多答案,但这肯定会奏效的!非常感谢你和我一起工作,凯西。很乐意帮忙!如果你不介意的话。。。不要忘记将此标记为正确答案(如果是)
Result = "[{\"PK_Task\":3,\"TaskName\":\"ExampleReportName\",\"BusinessName\":\"ExampleBusinessName\",\"UserOwner\":\"Stack Leet\",\"UsersDto\":{\"PK_User\":123,UserName\":\"Stack.L   ...
Dictonary<DateTime, MyObject>
// Convert the json string from the API to a List:
List<MyObject> myObjects = JsonConvert.DeserializeObject<List<MyObject>>(dtoResponse.Result);

// Loop over list and make a Dictionary
Dictonary<DateTime, MyObject> model = new Dictonary<DateTime, MyObject>()
foreach (MyObject myObject in myObjects)
{
    if (myObject.ExecutionTime != null)
        model.Add(myObject.ExecutionTime, myObject);
}
var itemsToSendOut = from reports in model
  where reports.Value.ExecutionTimeFormatted  == DateTime.Now.ToString("hh:mm tt ")
  select reports;