如何在C#中通过LINQ查询PowerShell返回的Collection<PsObject>集合
C# 中LINQ查询PowerShell返回PsObject集合无结果排查方案
你当前使用的原始代码如下:
Collection<PsObject> result = powershell.Invoke(); var resultNumber = result.Where(x => (string)x.Properties["LineURI"].Value == "tel:" + phoneNumber);
可按照以下顺序排查问题:
- 确认PowerShell调用无报错
先判断powershell.HadErrors属性是否为true,如果为true说明PowerShell命令执行出错,返回的result集合可能不完整或数据异常,可以遍历powershell.Streams.Error查看具体错误信息。 - 处理空值与属性不存在的场景
部分PsObject实例可能不存在LineURI属性,或该属性的值为null,直接强转string会触发空引用异常,导致查询逻辑中断无结果。需要先判断属性和属性值是否存在,再做后续匹配。 - 处理字符串大小写与空白字符差异
PowerShell返回的LineURI值可能存在大小写差异(如TEL:、Tel:开头),或前后带有不可见空白字符,直接全等匹配会失败,建议统一格式化后再对比。 - 确认
LineURI的实际格式
多数场景下LineURI会携带额外参数,比如tel:+8613xxxxxxxxx;ext=1001、tel:+8613xxxxxxxxx;phone-context=xxxx这类后缀,如果你传入的phoneNumber仅包含号码部分,直接全等匹配会失败,可以改用前缀匹配逻辑。 - 确认LINQ查询已执行
你代码中Where方法返回的是延迟执行的迭代器,不会立刻执行查询逻辑,需要调用ToList()、Count()、FirstOrDefault()等方法触发查询后才能拿到实际结果。
优化后的参考代码
// 标准化目标匹配前缀 string targetPrefix = $"tel:{phoneNumber.Trim()}".ToLowerInvariant(); // 执行查询 var matchedItems = result.Where(x => { // 校验属性存在性 var lineUriProp = x.Properties["LineURI"]; if (lineUriProp?.Value == null) return false; string actualLineUri = lineUriProp.Value.ToString().Trim().ToLowerInvariant(); // 全量匹配用 ==,兼容带后缀的场景用 StartsWith return actualLineUri == targetPrefix; // return actualLineUri.StartsWith(targetPrefix); }).ToList(); // 触发查询执行,拿到实际匹配结果
内容的提问来源于stack exchange,提问作者Blen Blentoza
相关产品推荐
相关产品推荐

