Не удается неявно преобразовать тип «System.Linq.IQueryable <int>» в «int?» - PullRequest
27 голосов
/ 04 апреля 2010
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, но ничего не получалось. Помогите мне, ребята.

Спасибо

Ответы [ 6 ]

42 голосов
/ 04 апреля 2010

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

cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID
9 голосов
/ 16 августа 2013

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

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

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.

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

6 голосов
/ 04 апреля 2010

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

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

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

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

5 голосов
/ 04 апреля 2010

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

2 голосов
/ 04 апреля 2010

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

0 голосов
/ 08 октября 2015
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID
...