我有這個代碼可以從城市串列中為每個 ID 匹配的人選擇城市:
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 = (from s in cities where s.Id == item.CityId select s.name).ToString()
};
result.Add(personel);
}
return result;
}
但城市的價值是這樣的:
System.Linq.Enumerable WhereSelectListIterator`2[Personnel_Registration.City,System.String]
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
錯誤是因為型別系統元資料中沒有任何內容可以保證您不會匹配多個城市,因此運算式的結果是可能包含0、1 或更多城市的集合。您看到的是呼叫.ToString()該集合的結果。
要修復它,您可以執行以下操作:
public IEnumerable<PersonelDto> MapPersonelDto(IEnumerable<Personel> personels, IEnumerable<City> cities)
{
return personels.Select( p => {
new PersonelDto() {
Id = item.Id,
Maa? = item.Salary,
MedeniHal = item.MartialStatus,
Meslek = item.Job,
Soyisim = item.LastName,
?ehir = string.Join(",", cities.Where(c => c.Id == p.CityId).Select(c=> c.name));
}
});
}
或者,如果你確信你只想要一個城市,你可以這樣做:
public IEnumerable<PersonelDto> MapPersonelDto(IEnumerable<Personel> personels, IEnumerable<City> cities)
{
return personels.Select( p => {
new PersonelDto() {
Id = item.Id,
Maa? = item.Salary,
MedeniHal = item.MartialStatus,
Meslek = item.Job,
Soyisim = item.LastName,
?ehir = cities.FirstOrDefault(c => c.Id == p.CityId)?.name;
}
});
}
請注意完全沒有串列。你真的應該擺脫List<T>到處使用的習慣,而是IEnumerable<T>盡可能地讓事情保持不變。這可以使您的代碼更快,更高效地使用 RAM。
另一個好處是它使您的代碼更加靈活。例如,您仍然可以將現有串列傳遞給這個新方法。如果由于某種原因您需要將結果作為List<>下一個方法呼叫的 a (提示:您可能根本不需要這個),您總是可以.ToList()在呼叫該方法后添加 a 。但是,再一次,除非你真的必須這樣做,否則不要這樣做!
uj5u.com熱心網友回復:
from s in cities where s.Id == item.CityId select s.name
回傳一個 IEnumerable - 可能有不止一個城市
改為
?ehir = (from s in cities where s.Id == item.CityId select s.name).FirstOrDefault().ToString()
選擇第一個元素
請注意,這假設總是有一個匹配的城市。如果沒有,那么您應該提供一個默認值
?ehir = (from s in cities where s.Id == item.CityId select s.name).FirstOrDefault("unknow city").ToString()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494213.html
