C# .Net中LINQ Where查询返回迭代器而非城市名的修复方法
问题原因
你写的LINQ查询from s in cities where s.Id == item.CityId select s.name返回的是IEnumerable<string>类型的延迟执行迭代器,不会直接输出匹配到的城市名称。直接对迭代器对象调用.ToString()时,默认会返回该对象的类型全名字符串,也就是你看到的System.Linq.Enumerable+WhereSelectListIterator开头的异常输出。
修复方案
你需要在LINQ查询后追加单值取值方法,拿到匹配到的单个城市名称即可。由于人员的CityId理论上只会对应0或1个城市,推荐使用FirstOrDefault()方法:
- 直接替换原有错误的
Şehir字段赋值逻辑即可:
Şehir = cities.FirstOrDefault(s => s.Id == item.CityId)?.name ?? string.Empty
这里用null条件运算符?.做了空值处理,如果没有匹配到对应Id的城市,会返回空字符串,避免抛出空引用异常。
- 如果你更习惯使用查询语法,也可以写成:
Şehir = (from s in cities where s.Id == item.CityId select s.name).FirstOrDefault() ?? string.Empty
修复后的完整方法代码
public List<PersonelDto> MapPersonelDto(List<Personel> personels,List<City> cities) { var result = new List<PersonelDto>(); foreach (var item in personels) { var personel = new PersonelDto { Id = item.Id, Maaş = item.Salary, MedeniHal = item.MartialStatus, Meslek = item.Job, Soyisim = item.LastName, Şehir = cities.FirstOrDefault(s => s.Id == item.CityId)?.name ?? string.Empty }; result.Add(personel); } return result; }
性能优化参考:如果人员列表数据量较大,可以提前把城市列表转成以Id为Key的字典,把每次循环的线性查找复杂度从O(n)降到O(1),执行效率会更高:
public List<PersonelDto> MapPersonelDto(List<Personel> personels,List<City> cities) { // 提前构建城市Id-名称映射字典 var cityDict = cities.ToDictionary(c => c.Id, c => c.name); var result = new List<PersonelDto>(); foreach (var item in personels) { var personel = new PersonelDto { Id = item.Id, Maaş = item.Salary, MedeniHal = item.MartialStatus, Meslek = item.Job, Soyisim = item.LastName, // 直接从字典取值,匹配不到则返回空字符串 Şehir = cityDict.TryGetValue(item.CityId, out var cityName) ? cityName : string.Empty }; result.Add(personel); } return result; }
内容的提问来源于stack exchange,提问作者Kaan Alp Elpe
相关产品推荐
相关产品推荐

