Кто-нибудь знает, как преобразовать Google.Cloud.BigQuery.V2.BigQueryResults
в пользовательский тип? Насколько я вижу, тип BigQueryClient
не имеет обобщенных c версий ExecuteQuery
и ExecuteQueryAsync
.
Согласно руководству по быстрому запуску Google BigQuery мы можем сделать что-то подобное:
public class Foo
{
public string FirstValue { get; set; }
public string SecondValue { get; set; }
public string ThirdValue { get; set; }
}
public IEnumerable<Foo> GetQueryResult()
{
var queryExecutionResult = client.ExecuteQuery(Query, null);
foreach (var row in queryExecutionResult)
{
yield return new Foo
{
FirstValue = row["column1"],
SecondValue = row["column2"],
ThirdValue = row["column3"]
};
}
}
Я реализовал свой собственный конвертер, который использует отражение под капотом. Мне не совсем нравится отражение. Так что, возможно, кто-нибудь знает какой-то лучший способ. Я поставил свою реализацию ниже.
public class Foo
{
// I use custom attribute which is similar to DescriptionAttribute.
[BigQueryColumnName("column1")]
public string FirstValue { get; set; }
[BigQueryColumnName("column2")]
public string SecondValue { get; set; }
[BigQueryColumnName("column3")]
public string ThirdValue { get; set; }
}
public IEnumerable<Foo> GetQueryResult()
{
var queryExecutionResult = client.ExecuteQuery(Query, null);
return queryExecutionResult.Select(bigQueryRowToFooConverter.ConvertToFoo);
}
public Foo ConvertToFoo(BigQueryRow row)
{
var item = new Foo();
foreach (var propertyInfo in typeof(Foo).GetProperties())
{
var attribute = (BigQueryColumnNameAttribute)Attribute.GetCustomAttribute(propertyInfo, typeof(BigQueryColumnNameAttribute));
var value = row[attribute.ColumnName];
propertyInfo.SetValue(item, value);
}
return item;
}