Как преобразовать данные BigQuery в пользовательский тип? - PullRequest
0 голосов
/ 25 февраля 2020

Кто-нибудь знает, как преобразовать 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...