Ошибка преобразования при преобразовании значения varchar 'Zon7' в тип данных int
Я получаю эту ошибку:
Ошибка преобразования при преобразовании значения varchar 'Zon7' в тип данных int.
establishments = GetEstablishments(waters.Select(t => ReplaceZonToEmptyString(t.IdGeographie)));
public static int ReplaceZonToEmptyString(string zoneId)
{
zoneId.Replace("Zon", string.Empty);
var sbInput = zoneId.Replace(" ", string.Empty);
return Convert.ToInt32(sbInput.ToString());
}
public static IQueryable<Etablissement> GetEstablishments(IQueryable<int> ids)
{
return from zone in entities.Zones
where ids.Contains(zone.IdZone)
select zone.IdBatimentNavigation.IdEtablissementNavigation;
}
var result = establishments.ToList();
в базе данных у меня есть столбец типа varchar имя столбца "IdGeographie" со значениями, которые начинаются с "Zon", что-то вроде этого "ZonXXXX"
2 ответа
Вы пытаетесь сравнить VARCHAR
столбец со значениями типа int
, Необходимо изменить одно из этих значений, и, поскольку оно не является столбцом SQL, оно должно быть значением сравнения:
public static string ReplaceZonToEmptyString(string zoneId)
{
var sbInput = new StringBuilder(zoneId);
sbInput.Replace("Zon", string.Empty);
sbInput.Replace(" ", string.Empty);
return sbInput.ToString();
}
public static IQueryable<Etablissement> GetEstablishments(IQueryable<string> ids)
{
return from zone in entities.Zones
where ids.Contains(zone.IdZone)
select zone.IdBatimentNavigation.IdEtablissementNavigation;
}
Если сигнатура методов не может измениться, вы должны выполнить преобразование в течение GetEstablishments
:
public static IQueryable<Etablissement> GetEstablishments(IQueryable<int> ids)
{
var textIds = ids.Select(id => id.ToString());
return from zone in entities.Zones
where textIds.Contains(zone.IdZone)
select zone.IdBatimentNavigation.IdEtablissementNavigation;
}
Обратите внимание, что в waters.Select(t => ReplaceZonToEmptyString(t.IdGeographie))
, Значение waters
должен быть материализованным списком значений (т. е. не другим EF-запросом), поскольку операция замены не может работать в Entity Framework (ни в одном из вариантов).
Как вы думаете, что будет делать следующий код:
string original = "Hello World!";
string changed = original.Recplace("o", "xx");
original
не изменится, changed
будет равняться "Hellxx, Wxxrld".
Так что вы должны изменить свою ReplaceZonToEmptyString:
public static int ExtractZoneNr(string zoneId)
{
string idWithoutZon = zoneId.Replace("Zon", string.Empty);
string sbInput = idWithoutZon.Replace(" ", string.Empty);
return Int32.Parse(sbInput);
}
Увы, это будет работать только на IEnumerable, а не на IQueryable
Лучшее решение:
Это решение работает только если IdGeographie
это три буквы "Zon", за которыми следует строковое представление IdZone
и ничего больше. Так что без пробелов, без начальных нулей и т. Д.: "Zon4" и не "Zon004", ни "Zon 4"
У вас есть два IQueryables
один для воды и один для зон:
IQuerybale<Water> waters = ... // probably entities.Waters
IQueryable<Zone> zones = entities.Zones
каждый Zone
содержит свойство int IdZone
и собственность .IdBatimentNavigation.IdEtablissementNavigation
который, кажется, имеет тип Etablissement
Далее каждый Water
имеет строковое свойство GeographieId
в формате "ZonX", где X - целое число.
Теперь вы хотите запросить IdBatimentNavigation.IdEtablissementNavigation
из всех Zones
с IdZone
которая равна X части одного или нескольких из Waters
Например: если у вас есть следующее Waters
[0] GeographieId = "Zon10"
[1] GeographieId = "Zon42"
[2] GeographieId = "Zon7"
И у тебя есть Zones
с IdZone
: 4, 42, 30, 7, 22.
Тогда в результате вы хотите IdBatimentNavigation.IdEtablissementNavigation
из Zones
с IdZone
: 42 любая 7 (в любом порядке)
Почему бы не объединить воды и зоны?
var result = zones.
.Select(zone => new
{
GeographieId = "Zon" + zone.IdZone.ToString(),
Etablissement = zoneIdBatimentNavigation.IdEtablissementNavigation,
})
.Join(waters, // join with waters
zone => zone.GeographieId, // from zone take the GeoGraphieId
water => water, // from waters take idGeographie
(zone, water) => zone.Etablissement); // when thay match return
Лучшим решением было бы попытаться удалить часть "Zon" из IdGeographie и проанализировать оставшиеся XXXX в int. Увы, нет функции, которая может выполнять разбор AsQueryable.