【问题标题】:Adding Batch GET request results to a list using Simple.Odata.Client使用 Simple.Odata.Client 将批量 GET 请求结果添加到列表
【发布时间】:2020-01-17 05:36:22
【问题描述】:

使用 Simple.Odata.Client,我正在批处理 GET 请求并将这些请求的结果添加到列表中。如下:

        var results = new List<Thing>();
        var ids = new List<long>() { 1, 2, 3, 4, 5, 6 };

        var batch = new ODataBatch(_client);

        foreach (var id in ids)
        {
            batch += async c =>
            {
                results.Add(await c.For<Thing>().Key(id).FindEntryAsync());
            };
        }

        await batch.ExecuteAsync();

问题在于(如此处所述 - https://github.com/simple-odata-client/Simple.OData.Client/issues/181)批处理处理程序被调用了两次,这意味着对于添加到结果列表的每个成功结果,也会添加一个空值。

据说解决方案是“将所有与批处理操作无关的语句(如 results.Add(...))移出批处理 lambda。”但是我不明白如何做到这一点,因为我无法访问 lambda 之外的批处理请求的结果。我知道一个解决方案是在将结果添加到结果列表之前检查 null 但我想看看是否有人知道更好的方法,或者可以解释如何在批处理 lambda 之外添加结果。谢谢:)

【问题讨论】:

    标签: c# lambda odata


    【解决方案1】:

    在这里回答我自己的问题。因为批处理处理程序被调用了两次,所以我找到的唯一真正的解决方案是将查询结果分配给批处理 lambda 中的局部变量,然后仅当结果不为 null 时才将该结果添加到结果列表中。

    这是一个例子:

            var results = new List<Thing>();
            var ids = new List<long>() { 1, 2, 3, 4, 5, 6 };
    
            var batch = new ODataBatch(_client);
    
            foreach (var id in ids)
            {
                batch += async c =>
                {
                    Thing result;
                    result = await c.For<Thing>().Key(id).FindEntryAsync();
    
                    if (result != null) {
                        results.Add(result);
                    }
                };
            }
    
            await batch.ExecuteAsync();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多