在 C# 中迭代​​ "Task<IEnumerable<T>>"?

Iterate "Task<IEnumerable<T>>" in c#?

我正在玩 Scylla db 并在 15 年来第一次使用 C#。

在阅读了几天有关 Scylla 和 C# 的内容后,我得到了以下代码。在下面的代码中,我连接到 scylla 集群并尝试查询 table 以从中获取数据。

public static async void test()
{
    var cluster = Cluster.Builder().AddContactPoints("test-endpoint").WithQueryOptions(new QueryOptions().SetConsistencyLevel(ConsistencyLevel.LocalQuorum)).Build();
    var session = cluster.Connect("processks");
    var mapper = new Mapper(session);

    var cql = Cql.New("SELECT * FROM test LIMIT 10");
    var fetchResult = await mapper.FetchAsync<User>(cql).ConfigureAwait(false);
    // this just prints the object which is not what I want
    Console.WriteLine(fetchResult);
}

下面是我的Userclass:

using System.Collections.Generic;
using Cassandra.Mapping;
using Cassandra.Mapping.Attributes;

namespace Test.Objects.POCO.Scylla
{
    [TableName("test")]
    [PrimaryKey("client_id")]
    public class User
    {
        [Column("client_id")]
        public int ClientId { get; set; }

        [Column("md")]
        public string MD { get; set; }

        [Column("process_ids")]
        public List<int> ProcessIds { get; set; }
    }
}

如何迭代 fetchResult 对象以打印出执行上述查询后返回的数据?

这是 Mapper class 的代码 link,其中定义了 FetchAsync 方法,它 returns Task<IEnumerable<T>> 返回对象。

var fetchResult = await mapper.FetchAsync<User>(cql).ConfigureAwait(false);

fetchResult 将是一个 IEnumerable<User>,因此您可以根据需要遍历 IEnumerable 并使用任何方法打印底层 User 对象更喜欢。

Console.WriteLine 打印所提供对象的 ToString() 方法的结果,返回的 IEnumerable 对象和包含的 User 对象都没有您要的默认实现寻找。

您可以在 User class 上实施 ToString() 并执行如下操作:

Console.WriteLine(string.Join(Environment.NewLine, fetchResult));

或者您可以只使用 JSON 库将用户对象转换为 JSON 字符串,而不是覆盖 ToString():

Console.WriteLine(string.Join(
    Environment.NewLine, 
    fetchResult.Select(user => JsonConvert.SerializeObject(user))))

[编辑]您可能对我们的示例和文档感兴趣:

https://www.datastax.com/examples(可以按C#语言筛选)

https://docs.datastax.com/en/developer/csharp-driver/3.14/features/components/mapper/