C# 使用Simple.Odata.Client将批处理获取请求结果添加到列表

C# 使用Simple.Odata.Client将批处理获取请求结果添加到列表,c#,lambda,odata,C#,Lambda,Odata,我使用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)

我使用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();
var results=newlist();
var id=newlist(){1,2,3,4,5,6};
var batch=新的ODataBatch(\u客户端);
foreach(id中的变量id)
{
批处理+=异步c=>
{
Add(等待c.For().Key(id.findentryanc());
};
}
等待batch.ExecuteAsync();
问题在于(如本文所述)批处理程序被调用两次,这意味着对于添加到结果列表的每个成功结果,也会添加一个空值


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

在这里回答我自己的问题。因为批处理程序被调用了两次,所以我找到的唯一真正的解决方案是将查询结果分配给批处理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();
var results=newlist();
var id=newlist(){1,2,3,4,5,6};
var batch=新的ODataBatch(\u客户端);
foreach(id中的变量id)
{
批处理+=异步c=>
{
事物结果;
结果=等待c.For().Key(id).findentryanc();
如果(结果!=null){
结果。添加(结果);
}
};
}
等待batch.ExecuteAsync();