如何用C#和LINQ获取列表数据?解决类型转换报错问题
遍历城市列表获取数据的类型转换错误修复
错误信息
无法隐式转换类型“System.Collections.Generic.List<StateAPI.Models.CityModel>”为“StateAPI.Models.CityModel”(错误1)
无法从“System.Collections.Generic.List<StateAPI.Models.CityModel>”转换为“StateAPI.Models.CityModel”(错误2)
问题代码
模型类
//Models namespace StateAPI.Models { public class CityModel: ReadResponse { public string CityAddress { get; set; } public string CityPhone { get; set; } } }
控制器类
//Controller namespace StateAPI.Controllers { public class CityController : ApiController { SQLConnection SQLconn = new SQLConnection(); public CityModel GetCityInfo(string CityList) { if (string.IsNullOrEmpty(CityList)) { return new CityModel { Message = "No CityList Passed", }; } else { return SQLconn.GetCityMain(CityList); //Error 1 } } } }
GetCityMain方法
public List<CityModel> GetCityMain(string CityList) { String strSQL = String.Empty; String msg = String.Empty; String[] parms = { }; List<CityModel> output = new List<CityModel>(); var cities= CityList.Split(',').Select(x => x.Trim()); foreach (var city in cities) { strSQL = String.Format(GetCityInfoSQL, city); List<CityModel> info = SQLUtil.GetDataList<CityModel>( strSQL, parms.ToArray<string>(), out msg); output.Add(info); //Error 2 } return output; }
GetDataList方法
public static List<T> GetDataList<T>(string sql, String[] sqlparams, out String message) where T : new() { List<T> result = new List<T>(); message = String.Empty; DataSet ds; try { if (DbObject.GetDataSet(sql, sqlparams, SQLUtility.GetSqlConnString(), "data", out ds, out message)) { result = DataManager.Bind<List<T>>(ds.Tables[0]); } } catch (Exception ex) { message = "error message"; } return result; }
错误原因及修复方案
错误1修复
控制器的GetCityInfo方法声明返回单个CityModel,但调用的SQLconn.GetCityMain返回的是List<CityModel>,类型不匹配。
修改控制器方法的返回类型为List<CityModel>,同时处理空参数的情况:
public List<CityModel> GetCityInfo(string CityList) { var result = new List<CityModel>(); if (string.IsNullOrEmpty(CityList)) { result.Add(new CityModel { Message = "No CityList Passed", }); } else { result = SQLconn.GetCityMain(CityList); } return result; }
错误2修复
GetDataList<CityModel>返回的是List<CityModel>,而output.Add方法需要的是单个CityModel对象,直接添加列表会导致类型不匹配。
如果查询单个城市会返回包含一条数据的列表,使用AddRange将列表中的所有元素添加到output中:
foreach (var city in cities) { strSQL = String.Format(GetCityInfoSQL, city); List<CityModel> info = SQLUtil.GetDataList<CityModel>( strSQL, parms.ToArray<string>(), out msg); output.AddRange(info); // 替换Add为AddRange }
如果确定每条SQL只会返回一个城市数据,也可以取列表的第一个元素添加(需处理空列表情况):
if (info.Any()) { output.Add(info.First()); }
内容的提问来源于stack exchange,提问作者Jason M
相关产品推荐
相关产品推荐

