我使用以下C#
中的代码从BigQuery表中摘取一些数据 BigQueryClient client = BigQueryClient.Create("<Project Name>");
BigQueryTable table = client.GetTable("<Database>", "Students");
string sql = $"select * FROM {table} where Marks='50'";
BigQueryResults results = client.ExecuteQuery(sql);
foreach (BigQueryRow row in results.GetRows())
{
}
我希望能够将整个结果变量读取到JSON中,或者能够将JSON从每一行中删除。
当然,我可以创建一个对表进行建模的类。在foreach
循环中,我可以将每一行读取到类对象中。我可以尝试使用"牛顿软"等第三方序列化的类对象。
类似:
class Student{
int id; // assume these are columns in the db
string name;
}
我的foreach
现在看起来像:
foreach (BigQueryRow row in results.GetRows())
{
Student s=new Student();
s.id = Convert.ToString(row["id"]);
s.name= Convert.ToString(row["name"]);
// something like string x=x+ s.toJSON(); //using newton soft
}
这样的方式,字符串X将对每一行的JSON生成并附加。还是有一种方法可以将每个学生添加到集合或列表中,然后从整个列表中获取JSON?
按行和字段划分的整个排行似乎对我来说很乏味,我一定有一种更简单的方式。没有看到Google Bigquery的任何支持C#直接转换为JSON。他们确实在python中有东西。
如果不是,那么json的列表会更好,但我不确定是否支持。
更新:
https://github.com/googlecloudplatform/google-cloud-dotnet/blob/master/master/apis/google.cloud.bigquery.v2/google.cloud.cloud.bigquery.v2/bigquery.v2/bigquery.cs >
看起来大查询行类具有一个类型的tablerow字段。该类使用JSON参考文献,因此,我确定它们具有JSON格式的行数据。我如何将其暴露给我?
这可能有点迟了,但是您可以使用:
var latestResult = _bigQueryClient.ExecuteQuery($"SELECT TO_JSON_STRING(t) FROM `{ProjectId}.{DatasetId}.{TableName}` as t", null
所有列将被序列化为JSON,并将其放置在每行的第一列中。然后,您可以使用Newtonsoft之类的东西轻松解析每一行。
我遇到了同一问题。我正在发布此解决方案,该解决方案尚未针对性能进行优化,但对于多种数据类型非常简单。这使您可以对任何东西(几乎)
进行挑选public class BQ
{
private string projectId = "YOUR_PROJECT_ID";
public BQ()
{
}
public List<T> Execute<T>(string sql)
{
var client = BigQueryClient.Create(projectId);
List<T> result = new List<T>();
try
{
string query = sql;
BigQueryResults results = client.ExecuteQuery(query, parameters: null);
List<string> fields = new List<string>();
foreach (var col in results.Schema.Fields)
{
fields.Add(col.Name);
}
Dictionary<string, object> rowoDict;
foreach (var row in results)
{
rowoDict = new Dictionary<string, object>();
foreach (var col in fields)
{
rowoDict.Add(col, row[col]);
}
string json = Newtonsoft.Json.JsonConvert.SerializeObject(rowoDict);
T o = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
result.Add(o);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
client.Dispose();
Console.WriteLine("Done.");
}
return result;
}
}
您可以使用 newtonsoft.json 。首先由PackageManager控制台下载Nuget软件包,您可以在这里获取命令。
下载后您可以将其用作以下代码:
List<Student> list = new List<Student>();
foreach (BigQueryRow row in results.GetRows())
{
Student s=new Student();
s.id = Convert.ToString(row["id"]);
s.name= Convert.ToString(row["name"]);
list.Add(s);
}
var jsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(list);
我希望这可以帮助您。
这是施放BigQueryResults
或GetQueryResultsResponse
或QueryResponse
数据的完整解决方案,使用C#反射:
public List<T> GetBQAsModel<T>(string query) where T : class, new()
{
var bqClient = GetBigqueryClient();
var res = bqClient.ExecuteQuery(query, parameters: null);
return GetModels<T>(res);
}
private List<T> GetModels<T>(BigQueryResults tableRows) where T : class, new()
{
var lst = new List<T>();
foreach (var item in tableRows)
{
var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
var newObject = new T();
for (var i = 0; i < item.RawRow.F.Count; i++)
{
var name = item.Schema.Fields[i].Name;
PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
if (prop == null)
{
continue;
}
var val = item.RawRow.F[i].V;
prop.SetValue(newObject, Convert.ChangeType(val, prop.PropertyType), null);
}
lst.Add(newObject);
}
return lst;
}
private List<T> GetModels<T>(GetQueryResultsResponse getQueryResultsResponse) where T : class, new()
{
var lst = new List<T>();
foreach (var item in getQueryResultsResponse.Rows)
{
var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
var newObject = new T();
for (var i = 0; i < item.F.Count; i++)
{
var name = getQueryResultsResponse.Schema.Fields[i].Name;
PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
if (prop == null)
{
continue;
}
var val = item.F[i].V;
prop.SetValue(newObject, Convert.ChangeType(val, prop.PropertyType), null);
}
lst.Add(newObject);
}
return lst;
}
private List<T> GetModels<T>(QueryResponse queryResponse) where T : class, new()
{
var lst = new List<T>();
foreach (var item in queryResponse.Rows)
{
var lstColumns = new T().GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).ToList();
var newObject = new T();
for (var i = 0; i < item.F.Count; i++)
{
var name = queryResponse.Schema.Fields[i].Name;
PropertyInfo prop = lstColumns.FirstOrDefault(a => a.Name.ToLower().Equals(name.ToLower()));
if (prop == null)
{
continue;
}
var val = item.F[i].V;
prop.SetValue(newObject, Convert.ChangeType(val, prop.PropertyType), null);
}
lst.Add(newObject);
}
return lst;
}
我会做这样的事情:
var res = Result. Getrows. Select(x=> new student(){id=x[`ID']}).
,然后:
var js = json. Conver(res);
这种方式更快,更清晰。