Ошибка преобразования при преобразовании значения varchar 'Zon7' в тип данных int - PullRequest
0 голосов
/ 27 сентября 2018

Я получаю эту ошибку:

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

0 голосов
/ 27 сентября 2018

Как вы думаете, что будет делать следующий код:

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 any 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.

0 голосов
/ 27 сентября 2018

Вы пытаетесь сравнить столбец 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 (в любом из вариантов).

...