在C#中迭代“ Task <IEnumerable <T >>”?

时间:2020-05-07 06:37:32

标签: c# cassandra scylla

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

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

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);
}

下面是我的User班:

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类的代码link,其中定义了FetchAsync方法,并返回了Task<IEnumerable<T>>对象。

1 个答案:

答案 0 :(得分:3)

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

fetchResult将是IEnumerable<User>,因此您可以根据自己的喜好遍历IEnumerable,但是可以使用任何喜欢的方法来打印基础User对象。

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

您可以在ToString()类上实现User并执行以下操作:

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

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

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

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

https://www.datastax.com/examples(您可以按C#语言进行过滤)

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

相关问题