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

C#查询JSON数组中指定药物strength时报Where方法不存在错误如何解决

问题解决方法

错误原因

报错是两个问题共同导致的:

  • 实体类和JSON结构的映射不匹配,反序列化后属性会为空
  • Medication是普通实体类而非集合类型,不能直接调用LINQ的Where扩展方法,你需要先把它内部存储的三类药品集合合并后再查询

修复步骤

步骤1:修正实体类的JSON映射

给实体类属性加上JsonProperty注解,和JSON里的字段名对应:

public class Rootobject
{
    // JSON根节点字段是medic,不是medications
    [JsonProperty("medic")]
    public List<Medication> medications { get; set; }
}

public class Medication
{
    // 对应JSON里的ace字段
    [JsonProperty("ace")]
    public List<aceInhibitors> aceinhibitors { get ; set ; }
    // 对应JSON里的anti字段
    [JsonProperty("anti")]
    public List<anti> antianginal {get; set; }
    // 对应JSON里的anticoag字段
    [JsonProperty("anticoag")]
    public List<anticoag> anticoagulants {get; set; }
}

// 其余三个子类的JsonProperty你已经加对了,不需要修改

另外因为aceInhibitors、anti、anticoag三个类的属性完全一致,推荐你提取一个公共基类,方便后续查询:

public class MedicineBase
{
    [JsonProperty("name")]
    public string name { get; set; }
    [JsonProperty("strength")]
    public string strength { get; set; }
    [JsonProperty("dose")]
    public string dose { get; set; }
    [JsonProperty("route")]
    public string route { get; set; }
    [JsonProperty("sig")]
    public string sig { get; set; }
    [JsonProperty("pillCount")]
    public string pillCount { get; set; }
    [JsonProperty("refills")]
    public string refills { get; set; }
}

// 三个子类直接继承即可
public class aceInhibitors : MedicineBase {}
public class anti : MedicineBase {}
public class anticoag : MedicineBase {}

步骤2:修正查询逻辑

先把Medication实例里的三个集合合并,再做筛选查询:

class Program
{
    static void Main(string[] args)
    {
        string jsonString = @"..."; // 对应上述JSON字符串
        Console.WriteLine("Enter the Medication name in which you want to Find STRENGTH value :");
        string medicname = Console.ReadLine().Trim(); // 加Trim去掉首尾空格
        
        var rootInstance = JsonConvert.DeserializeObject<Rootobject>(jsonString);
        var medicationObj = rootInstance.medications[0];
        // 合并三类药品集合
        var allMedicines = new List<MedicineBase>();
        allMedicines.AddRange(medicationObj.aceinhibitors);
        allMedicines.AddRange(medicationObj.antianginal);
        allMedicines.AddRange(medicationObj.anticoagulants);
        // 查询匹配的药品strength,忽略大小写匹配体验更好
        var result = allMedicines.Where(x=>x.name.Equals(medicname, StringComparison.OrdinalIgnoreCase))
                                 .Select(t => t.strength)
                                 .ToList();

        // 可选输出逻辑
        if(result.Any())
        {
            Console.WriteLine($"对应药品规格为:{string.Join("、", result)}");
        }
        else
        {
            Console.WriteLine("未查询到对应药品");
        }
    }
}

如果你不想提取基类,也可以分别查询三个集合再合并结果,写法如下:

var result = medicationObj.aceinhibitors.Where(x=>x.name == medicname).Select(x=>x.strength)
              .Concat(medicationObj.antianginal.Where(x=>x.name == medicname).Select(x=>x.strength))
              .Concat(medicationObj.anticoagulants.Where(x=>x.name == medicname).Select(x=>x.strength))
              .ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:57:03