将NEST(Elasticsearch)搜索结果转换为DataSet - C#

3
我正在使用NEST来搜索我的Elasticsearch索引:
        var result = client.Search<MyObject>(s => s
            .From(0)
            .Size(10)
            // Query here
);

这段代码可以正常运行并返回一个Nest.SearchResponse对象。通过result.Hits.ToList()返回的格式是List<Nest.IHit<MyObject>>()

我该如何将返回的结果转换为DataSet(或DataTable)?

欢迎提供任何帮助。


这个 Hits.ToList() 功能还存在吗?我正在尝试使用它,但它对我不起作用。 - Benjamin Salerno
2个回答

3
您需要遍历您的结果。
DataTable dt = new DataTable();
dt.Columns.Add("Field1", typeof(string));
dt.Columns.Add("Field2", typeof(string));
...
foreach (IHit<JObject> x in result.Hits)
{
   dt.Rows.Add(
       x.Fields.FieldValuesDictionary["Prop1"] as JArray,
       x.Fields.FieldValuesDictionary["Prop2"] as JArray
       ...
   );
}    

阅读

以及

DocumentsWithMetaData

使用 NEST 0.12 进行搜索后,您将获得一个 QueryResponse,其中有两种方法可以循环处理您的结果。.Documents 是一个 IEnumerable,而 .DocumentsWithMetaData 则是一个 IEnumerable>,根据您的需要,其中一个可能更易于使用。

从 NEST 1.0 开始,.DocumentsWithMetaData 现在被简称为 .Hits。

http://nest.azurewebsites.net/breaking-changes.html


感谢您提供出色的答案和资源。 - Drew

1
此篇文章所提出的,您可以使用扩展方法将 IEnumerable<T> 转换为 DataTable
public static class IEnumerableExtensions
{
    /*Converts IEnumerable To DataTable*/
    public static DataTable ToDataTable<TSource>(this IEnumerable<TSource> data)
    {
        DataTable dataTable = new DataTable(typeof(TSource).Name);
        PropertyInfo[] props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in props)
        {
            dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ??
                prop.PropertyType);
        }

        foreach (TSource item in data)
        {
            var values = new object[props.Length];
            for (int i = 0; i < props.Length; i++)
            {
                values[i] = props[i].GetValue(item, null);
            }
            dataTable.Rows.Add(values);
        }
        return dataTable;
    }  
}

然后,在搜索之后,您可以这样做:

var dataTable = result.Documents.ToDataTable();

其中Documents是一个IEnumerable<MyObject>,它们是返回的命中结果内的文档。另一种获取这些文档的方法是:

var documents=result.Hits.Select(h => h.Source);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接