如何从async方法cosmodb返回结果?

时间:2018-02-07 19:03:07

标签: c# linq document azure-cosmosdb

在做了研究后我发现文件db api支持分组,所以我用linq实现了,

如何从数据库中看到结果?

static void Main(string[] args)
        {
            Program p = new Program();
            var result =  p.GetStartedDemo().Wait();
        }

        private async Task GetStartedDemo()
        {
            var client = new DocumentClient(new Uri(EndpointUri), PrimaryKey);
            var documentUri = UriFactory.CreateDocumentCollectionUri("testdb", "retrieve");
            var result = client.CreateDocumentQuery<Login>(documentUri)
                  .Where(i => i.logevent == "success" && i._ts > 1517405472 && i._ts <= 1518010272)
                  .GroupBy(t => t._ts);

            return result;
        }

错误:

var result = p.GetStartedDemo()。Wait();

无法分配隐式类型的代码变量。问题是什么?

1 个答案:

答案 0 :(得分:2)

您正在执行任务对象的“等待”方法,并尝试将其返回分配给“结果”变量。 如果您检查Task.Wait() method signature,则会看到它没有返回:

public void Wait();

我是你的例子,你的GetStartedDemo不需要返回任务并且是“异步”,你没有在其中进行任何异步操作。你可以简单地返回你想要的调用者方法。

如果您想了解CosmosDB,建议您查看Microsoft documentation about it

为了使您的代码可以工作,您只需更改方法的返回类型即可实际匹配您返回的内容:

// Considering that Login._t is of type "long":
private IEnumerable<IGrouping<long, Login>> GetStartedDemo()
{ /* ... */ }    

然后,在您的Main方法中,您可以打印按Login._t分组的项目:

    static void Main(string[] args)
    {
        Program p = new Program();
        var result =  p.GetStartedDemo();
        foreach (var group in result)
        {
            Console.WriteLine("Group: " + group.Key);

            foreach (Login login in group)
               Console.WriteLine("    " + login.SomeProperty); // print something from the login object.
        }
    }