如何将web服务的结果合并为动态类型,我可以使用Linq';s Zip或Lambda函数来查找要合并的行

本文关键字:合并 Zip Lambda 查找 函数 Linq 可以使 服务 结果 web 动态 | 更新日期: 2023-09-27 18:19:58

我似乎找不到正确的语法来找到一个原始对象来向它添加来自web服务的数据。有人能帮我修复语法吗,或者解释我应该如何做到这一点吗?

我得到了一个地址列表,我正在发送到web服务进行处理。地址列表还可以包含0到许多未知列,这些列应该保留,但不能发送到web服务,所以我使用的是动态类型,它允许我保留所有未知行,并轻松添加从web服务返回的数据。这就是数据进入服务器端处理程序的方式:

dynamic userAddresses = JsonConvert.DeserializeObject(json);

反序列化后userAddresses对象的一个简单示例如下:

{
"Addresses": [
{
  "id": "",
  "address": "1 Royal Way",
  "city": "Kansas City",
  "state": "MO",
  "zipcode": ""
}
]
}

对于像这样的传入json字符串:

"{'"Addresses'":[{'"id'":'"'",'"address'":'"1 Royal Way'",'"city'":'"Kansas City'",'"state'":'"MO'",'"zipcode'":'"'"}]}"

然后,我以线程方式一次向web服务发送500个地址。我已经得到了结果,我一直在努力寻找原始项目。所以我得到的web服务结果将在一个响应变量中。两者都有一个必须唯一的id字段。到目前为止,这就是我所拥有的,但我得到了一个未知类型的e.变量

foreach (var response in webServiceResponses)
{
  dynamic request = userAddresses.Addresses.Find(e => e.id == response.id); // Error on e.id
  // Now enhance original request with addition data return by web service
}

在我寻找答案的过程中,我发现了Zip的Linq函数,如果它能与动态类型一起使用,那可能是一个更好的方法。

如何将web服务的结果合并为动态类型,我可以使用Linq';s Zip或Lambda函数来查找要合并的行

我会完全转储dynamic对象;它增加了不必要的复杂性。我会将json字符串反序列化为一个匿名类型数组,如下所示:

var userAddresses = 
    JObject
    .Parse(json)["Addresses"]
    .Select(x => new { 
        Id = Int32.Parse(x["id"].ToString()),
        Properties = 
            x
            .OfType<JProperty>()
            .Where(y => y.Name != "id")
            .Select(y => new { y.Name, Value = y.Value.ToString() })
    });

这将为您提供一个数组匿名类型,如下所示:

{
  "Id":1,
  "Properties":[
    {
      "Name":"address",
      "Value":"1 Royal Way"
    },
    {
      "Name":"city",
      "Value":"Kansas City"
    },
    {
      "Name":"state",
      "Value":"MO"
    },
    {
      "Name":"zipcode",
      "Value":""
    }
  ]
}

然后你可以将你的回答与以下内容配对:

var pairs = 
    webServiceResponses
    .Join(
        userAddresses,
        response => response.Id,
        address => address.Id,
        (response, address) => new { Response = response, Address = address });

现在你可以用任何你喜欢的方式操作这些了。

根据注释进行编辑

试试这门课:

public class UserAddress
{
    public int Id { get; set; }
    public Dictionary<string, string> Properties { get; set; }
}

使用此代码(从上面稍微修改):

IEnumerable<UserAddress> userAddresses =
    JObject
    .Parse(json)["Addresses"]
    .Select(x => new UserAddress()
        {
            Id = Int32.Parse(x["id"].ToString()),
            Properties =
                x
                .OfType<JProperty>()
                .Where(y => y.Name != "id")
                .ToDictionary(y => y.Name, y => y.Value.ToString())
        });
var pairs =
    webServiceResponses
    .Join(
        userAddresses,
        response => response.Id,
        address => address.Id,
        (response, address) => new { Response = response, Address = address });
foreach (var pair in pairs)
{
    // Add each key'value pair in pair.Response to pair.Address.Properties.
}