繁体   English   中英

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

[英]How to merge the results of a web service to a dynamic type, can I use Linq's Zip or a Lambda function to find the row to merge

我似乎无法正确地找到从Web服务向其添加数据的原始对象的语法。 有人可以帮助我修复我的语法,或解释我应该如何做吗?

我正在获取要发送到Web服务进行处理的地址列表。 地址列表也可以包含0到许多应保留的未知列,但不发送给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\":\"\"}]}"

然后,我以线程方式一次将500个地址发送到Web服务。 我得到的结果回来了,我一直在努力寻找原始项目。 所以我得到的Web服务结果将在响应变量中。 两者都有一个ID字段,该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函数,如果它与动态类型一起工作,那可能是一种更好的方法。

我将完全丢弃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.
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM