2009-01-12 14 views
5

Soy un poco novato cuando se trata de SQL a SQL pero espero que pueda ayudar. He escrito la siguiente declaración de LINQ to SQL con métodos de extensión:¿Por qué recibo "Reparto inválido" cuando uso Linq para SQL?

Cedb.ClassEvents.Where(c => c.ClassID == 1).Select(c => c).Single() 

Dónde CEDB es el DataContext, ClassEvents es una tabla (para clases y eventos que tienen lugar en una instalación) y ClassID es una clave entero único.

Esta consulta funciona bien en LinqPad (sin Cedb). Cuando vuelve, dice que el tipo de devolución es "ClassEvent". En Intellisense en Visual Studio, me dice que el tipo de devolución de esta consulta es ClassEvent (creado en mi modelo de datos). Sin embargo, cuando trato de colocar los resultados en una variable:

var classEvent = Cedc.ClassEvents.Where(c.ClassID == 1).Select(c => c).Single(); 

en cuando me siento un error: InvalidCastException: especificar la conversión no es válida. Lo mismo ocurre si utilizo la clase "ClassEvent" en lugar de la var. Soy nuevo en esto, pero este parece ser un verdadero mate en lugar de un error. ¿Hay algo sobre el método único que no sé que conduce al error? ¡Cualquier ayuda sería apreciada!

Respuesta

5

Slace - y cualquier otra parte interesada. La causa del error "Excepción de lanzamiento no válido" fue un cambio en el modelo de datos subyacente. Un campo pequeño había sido cambiado a bit. Por lo tanto, cuando el sistema intentó asignar los resultados de la consulta a la estructura de datos "ClassEvent", surgió el conflicto entre el modelo (que no se había actualizado) y la tabla de datos.

No obstante, agradezco la respuesta!

+0

Gracias por su respuesta, lamentablemente esto significa que no podemos usar Linq en SQL para hablar con una base de datos que podría tener un esquema ligeramente diferente? – jpierson

1

No es necesario hacer las dos cosas a Seleccione y una individual, de hecho, ni siquiera es necesario el caso, puede salirse con (ver http://msdn.microsoft.com/en-us/library/bb535118.aspx):

var classEvent = Cedc.ClassEvents.Single(c => c.ClassID == 1); 

que había También recomendamos no usar Single a menos que esté 100% seguro de que Func<T, bool> siempre devolverá un valor, ya que si no devuelve un valor, tendrá una excepción lanzada. Mejor es usar SingleOrDefault y hacer una comprobación nula antes de la interacción con el objeto (http://msdn.microsoft.com/en-us/library/bb549274.aspx)

+0

¡Gracias! Empecé a escribir "y si alguien sabe de una manera más simple ..." porque recuerdo un artículo de "10 Mitos" que explicaba algo por el estilo. Sin embargo, me gustaría entender lo que hace todo y no solo buscar un atajo. Afortunadamente, hiciste ambas cosas. Gracias de nuevo. –

+0

Enlace a [10 LINQ Myths] (http://www.albahari.com/nutshell/10linqmyths.aspx) – Justin

Cuestiones relacionadas