2010-04-04 16 views
22
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; 
} 

Otrzymuję błąd w drugim zapytaniu, jak widać w tytule tego wpisu. Próbowałem przekonwertować na int na nullable int, ale nic nie działało. Pomóżcie mi, chłopaki.Nie można niejawnie przekonwertować typu "System.Linq.IQueryable <int>" na "int?"

Dzięki

+0

Czy jest więcej w twoim przykładzie? Wygląda na to, że obiekt City będzie zawsze odrzucany po każdej iteracji pętli? – R0MANARMY

Odpowiedz

35

będzie zwracać IQueryable, trzeba będzie coś zrobić, jak przy pierwszym

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

oops Byłem tak głupi, aby zadać to pytanie, właściwie tego nie zauważyłem, właściwie cały czas koncentrowałem się na tym cnt.DOTWInternalID == citee.CountryCode nie na powrocie ID .. * westchnienie * – Aneef

+2

Nie tępy , Zaczynam od linq i ta odpowiedź była właśnie tym, czego potrzebowałem! dzięki – pauloya

2

jako komunikat o błędzie mówi zapytanie LINQ zwraca System.Linq.IQueryable (dla wszystkich zamiarów i celów zbiór wskazówki). Jeśli chcesz uzyskać jedno z nich, możesz zadzwonić pod numer First lub ElementAt(n), aby otrzymać n-ty element.

5

IQueryable nie jest pojedynczym int - ale kwerendy, które mogą stanowić zbiór.

6

Tutaj jest problem i rozwiązanie

z CNT w db.Countries gdzie cnt.DOTWInternalID == citee.CountryCode wybrać cnt.ID część. Jeśli pominiesz identyfikator, to zwróci on Generic IEnumerable with Country (mając nadzieję, że masz klasę Country). Musisz najpierw zwrócić wybrane kryteria i wybrać pierwszy wiersz, a następnie pole ID. To samo, co pokazano poniżej.

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

To rozwiąże twój problem.

8

Minęło dużo czasu od ostatniej aktualizacji postu, ale myślę, że warto ulepszyć rozwiązanie.

Moim zdaniem, rozwiązania opracowane dla tego konkretnego scenariusza nie są najlepszym sposobem pod względem wydajności, aby uzyskać ID, którego potrzebujesz. Lepsze rozwiązanie jest następujące.

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

poprzedniego statemants zasadzie uruchamia zapytanie SQL podobny do następującego:

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

Proponowane rozwiązania działać, ale w zasadzie zrobić "SELECT *" aby utworzyć podmiot ze wszystkimi wartościami, a następnie uzyskać identyfikator z właśnie utworzonego obiektu.

Możesz użyć Linqpad, aby zobaczyć wygenerowany kod SQL i dostroić zapytania LINQ lub Lambdas.

Mam nadzieję, że pomoże to innym, którzy dostają się do tego posta.

0
cit.CountryID = db.Countries.First(a=>a.DOTWInternalID == citee.CountryCode).ID 
Powiązane problemy