Подтвердить что ты не робот

Невозможно неявно преобразовать тип 'System.Linq.IQueryable <int>' в 'int?'

var cityList = from country in 
                    doc.Element("result")
                    .Element("cities")
                    .Descendants("city")
select new {
        Name = country.Element("name").Value,
        Code = country.Element("code").Value,
        CountryCode = int.Parse(country
                      .Element("countrycode")
                      .Value)
    };

foreach(var citee in cityList)
{
    City city = new City();
    city.CountryID = from cnt in db.Countries 
                     where cnt.DOTWInternalID == citee.CountryCode 
                     select cnt.ID;
}

Я получаю сообщение об ошибке во втором запросе, как показано в заголовке этого сообщения. Я попытался преобразовать в int в nullable int, но ничего не получилось. Помогите мне, ребята.

Спасибо

4b9b3361

Ответ 1

он вернет iQueryable, вам нужно будет сделать что-то вроде первого

cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID

Ответ 2

Прошло много времени с момента последнего обновления сообщения, но я думаю, что стоит улучшить решение.

По моему мнению, решения, размещенные для этого конкретного сценария, не являются лучшим способом с точки зрения производительности, чтобы получить требуемый идентификатор. Лучшее решение заключается в следующем.

db.Countries.Where(a=>a.DOTWInternalID == citee.CountryCode)
            .Select(a => a.ID).FirstOrDefault();

Предыдущие statemants в основном выполняют SQL-запрос, похожий на следующий:

SELECT TOP (1) ID
FROM [dbo].[Countries]
WHERE DOTWInternalID = 123

Предлагаемые решения работают, но в основном делают "SELECT *" для создания объекта со всеми значениями, а затем получают идентификатор из только что созданного объекта.

Вы можете использовать Linqpad, чтобы фактически увидеть сгенерированный SQL и настроить LINQ-запросы или Lambdas.

Надеюсь, что это поможет некоторым другим, кто попадает на этот пост.

Ответ 3

Вот проблема и решение

из cnt в db.Countries, где cnt.DOTWInternalID == citee.CountryCode выберите cnt.ID. Если вы опустите идентификатор, он возвращает Generic IEnumerable со страной (надеясь, что у вас есть класс Country). Так что вам нужно сначала вернуть критерии выбора и выбрать первую строку, а затем поле ИД. То же, что показано ниже.

cit.CountryID = (from cnt in db.Countries where cnt.DOTWInternalID == citee.CountryCode   select cnt).First<Country>().ID;

Это решит вашу проблему.

Ответ 4

IQueryable - это не один int, а запрос, который может представлять коллекцию.

Ответ 5

Как говорится в сообщении об ошибке, ваш запрос Linq возвращает System.Linq.IQueryable(для всех целей и целей - набор ints). Если вы хотите получить один из них, вы можете либо вызвать First, либо ElementAt (n), чтобы получить n-й элемент.

Ответ 6

cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID