You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取System.Linq.Dynamic.Core动态查询列的值与类型?

解决动态查询结果转带值和类型结构的问题

看起来你已经走对了方向,但卡在了针对每个属性单独处理值和类型这一步上。咱们一步步拆解问题:

问题根源

你之前的两种写法都没命中核心需求:

  1. 第一种写法MyHelper.GetType(x)里的x是整个匿名对象实例,但你的GetType方法需要的是PropertyInfo类型的参数,类型不匹配所以报错。
  2. 第二种写法MyHelper.GetType(x.GetType())传入的是匿名类型的整体Type,得到的是匿名类型的名称(比如<>f__AnonymousType03`),而不是每个属性的实际类型,自然不符合需求。

正确解决方案

因为你是用动态查询得到的匿名类型集合,我们需要通过反射遍历每个对象的单个属性,分别获取属性值和属性类型,再组装成你要的结构。

代码实现(用字典返回)

var rows = data.Select(item => 
{
    var itemType = item.GetType();
    // 遍历当前对象的所有属性
    return itemType.GetProperties().ToDictionary(
        prop => prop.Name, // 键为列名
        prop => new 
        {
            value = prop.GetValue(item), // 获取属性值
            type = MyHelper.GetType(prop) // 用你的方法获取属性类型
        }
    );
});

代码实现(用ExpandoObject返回,序列化后更贴近示例JSON)

如果希望返回的对象在序列化后和你给出的示例结构完全一致,可以用ExpandoObject:

var rows = data.Select(item => 
{
    var result = new ExpandoObject() as IDictionary<string, object>;
    var itemType = item.GetType();
    
    foreach (var prop in itemType.GetProperties())
    {
        result[prop.Name] = new 
        {
            value = prop.GetValue(item),
            type = MyHelper.GetType(prop)
        };
    }
    
    return result;
});

验证你的MyHelper.GetType方法

你的类型处理方法是没问题的:

  • 对于可空类型(比如Nullable<decimal>),会返回底层的decimal
  • 对于普通类型(比如string),会直接返回类型名称

用上面的代码处理后,你会得到和示例一致的结果:

[ 
  { 
    "col1": { "value": "This", "type": "string" }, 
    "col2": { "value": 1.56, "type": "decimal" },
    "col3": { "value": "Something else", "type": "string" } 
  } 
]

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:32:38