Ошибка преобразования при преобразовании значения 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.

Другие вопросы по тегам