2010-04-04 49 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; 
} 

Recibo un error en la segunda consulta como se ve en el título de esta publicación. Traté de convertir a int a nullable int pero nada funcionó. Ayúdenme, muchachos.No se puede convertir implícitamente el tipo 'System.Linq.IQueryable <int>' en 'int?'

Gracias

+0

¿Hay más en su ejemplo? Parece que el objeto City siempre será descartado después de cada iteración del ciclo? – R0MANARMY

Respuesta

35

devolverá un IQueryable, tendrá que hacer algo como el uso de la Primera

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

Vaya que era tan tonto como para hacer esta pregunta, en realidad no me di cuenta de esto, en realidad yo estaba todo este tiempo concentrado en este cnt.DOTWInternalID == citee.CountryCode no el ID de regresar .. * suspiro * – Aneef

+2

No mudo ¡Estoy empezando con linq y esta respuesta era exactamente lo que necesitaba! Gracias – pauloya

2

Como dice el mensaje de error, la consulta LINQ devuelve un System.Linq.IQueryable (para todos los efectos, una colección de enteros). Si desea obtener uno de ellos, puede llamar al First o ElementAt(n) para obtener el n-ésimo elemento.

5

IQueryable no es un solo int - pero una consulta que puede representar una colección.

6

Aquí está el problema y la solución

de CNT en db.Countries donde cnt.DOTWInternalID == citee.CountryCode seleccionar cnt.ID parte. Si omite el ID, devuelve un genérico IEnumerable con el país (esperando que tenga la clase Country). Entonces, lo que tienes que hacer es devolver primero los criterios de selección y seleccionar la primera fila, luego el campo ID. Lo mismo que se muestra a continuación.

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

Esto resolverá su problema.

8

Ha transcurrido un largo tiempo desde la última actualización de la publicación, pero creo que vale la pena mejorar la solución.

En mi opinión, las soluciones publicadas para este escenario en particular no son la mejor manera en términos de rendimiento para obtener la identificación que necesita. Una mejor solución es la siguiente.

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

Los statemants anteriores, básicamente, se ejecuta una consulta SQL similar a la siguiente:

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

Las soluciones propuestas funcionan, pero, básicamente, hacer un "SELECT *" para crear la entidad con todos los valores y luego obtener el ID del objeto recién creado.

Puede usar Linqpad para ver realmente el SQL generado y ajustar las consultas LINQ o Lambdas.

Espero que ayude a algunos otros que llegan a esta publicación.

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