在 expandoObject 列表中搜索

本文关键字:搜索 列表 expandoObject | 更新日期: 2023-09-27 18:36:27

假设我有一List动态对象,例如:

var records = [
  {
    "Id": 1,
    "Name": "sai",
    "Age": "4",
    "About": "12.02.1991"
  },
{
    "Id": 2,
    "Name": "hjfh",
    "Age": "2",
    "About": "12.02.1991"
  },
{
    "Id": 3,
    "Name": "hello name",
    "Age": "6",
    "About": "hi"
  },
{
    "Id": 4,
    "Name": 1,
    "Age": "9",
    "About": "hello world"
  }
]
string searchString = "Hello";

我尝试了类似的东西:

foreach (var item in records )
{
    foreach (var field in item)
    {
        if (field.Value != null && field.Value.ToString().IndexOf(query.SearchString, StringComparison.OrdinalIgnoreCase) >= 0) 
        {
            count++;
            break;
        }
    }
}

我想要记录中任何字段searchString的记录计数。 但是我可以使用LINQ查询来编写它吗?

在 expandoObject 列表中搜索

这是您的代码,转换为 linq 表达式:
您可以访问 select 语句中的字段和对象。

    records.Cast<ExpandoObject>().SelectMany(x => x, (obj, field) => new { obj, field })
        .Where(x => x.field.Value != null && x.field.Value.ToString().IndexOf(SearchString, StringComparison.OrdinalIgnoreCase) >= 0)
        .Select(x => x.field.Key);

要计算至少有一个包含搜索字符串的字段的对象数,请执行以下操作:

    records.Cast<ExpandoObject>()
        .Where(x => x.Any(y => y.Value != null && y.Value.ToString().IndexOf(SearchString, StringComparison.OrdinalIgnoreCase) >= 0))
        .Count();

它会是这样的:逻辑:

var qry = records.Where(x=>x.Field.Contains(searchedstring)).Count();

真实例子:

var qry = records.Where(x=>x.Name.Contains("sai")).Count();

下面是最简单的代码。

int count = records.Count(x => x.Name.StartsWith("hello") || x.About.StartsWith("hello"));