在 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);
}
下面是我的User
class:
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/
我正在玩 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);
}
下面是我的User
class:
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/