在expandoObject列表中搜索

sat*_*r V 0 c# linq search list dynamic

假设我有一个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";
Run Code Online (Sandbox Code Playgroud)

我尝试过类似的东西:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要记录searchString中任何字段的记录数.但我可以使用LINQ查询来写这个吗?

Tim*_*aut 7

这是您的代码,转换为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);
Run Code Online (Sandbox Code Playgroud)

要计算至少包含一个包含searchstring的字段的对象数:

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