2009-02-09 18 views
17

¿Qué (si existe) es la diferencia entre los resultados de las siguientes dos versiones de esta consulta de VB Linq?¿Qué significa la sintaxis "Nuevo ... con" en VB Linq?

'supongamos que tenemos un XElement que contiene detalles de los empleados se define otra cosa

Dim ee = From e In someXML.<Employee> _ 
Select New With {.Surname = e.<Surname>, .Forename = e.<Forename>} 

y

Dim ee = From e In someXML.<Employee> _ 
Select Surname = .Surname = e.<Surname>, .Forename = e.<Forename> 

algún lugar decir cuál es el punto de la nueva ... Con la sintaxis?

Sospecho que esto tiene una respuesta simple, pero no puedo encontrarlo, cualquier enlace a tutoriales adecuados o documentación de Microsoft sería apreciado.

Respuesta

14

La diferencia es que el primero crea explícitamente un tipo anónimo. La segunda es una expresión de consulta, y puede usar un tipo existente en lugar de crear un tipo anónimo. De la documentación vinculada por Cameron MacFarland:

Las expresiones de consulta no siempre requieren la creación de tipos anónimos. Cuando es posible, usan un tipo existente para contener los datos de la columna. Esto ocurre cuando la consulta devuelve registros completos de la fuente de datos o solo un campo de cada registro.

+0

¿No significa simplemente que cuando selecciona una columna _single_ no hay un tipo anónimo? Por lo tanto, no es aplicable al ejemplo anterior, donde se usan 2 columnas. –

+0

Sí, probablemente no haya diferencia en ese ejemplo. Pero en el caso _general_, esa es la diferencia _potencial_. Además, puede usar un tipo existente si devuelve el registro completo, por lo que no es solo para columnas individuales. –

+0

Ambos aspectos del código usan un tipo anónimo, siempre. – JaredPar

1

Se llaman Anonymous Types.

La razón principal de su uso es mantener los datos de una consulta en un solo objeto, por lo que los iteradores pueden continuar iterando sobre una lista de objetos.

Tienden a funcionar como tipos temporales para almacenamiento en el medio de una consulta LINQ grande o de varias partes.

+0

Sí, sé lo que son pero, ¿cuál es la diferencia entre estas dos formas de la sintaxis? El enlace que proporcionó brinda un ejemplo de ambos formularios, pero no dice si son equivalentes. –

+0

Claro que sí: le señalé exactamente en ese enlace para usted. –

+0

ok - combinando tu enlace Cameron con la explicación de Joel tiene sentido ahora. Muchas gracias a todos. –

2

Según tengo entendido, no hay diferencia.

New With está dirigido a fuera de la consulta, como el uso

Dim X = New With { .Surname = "A", .Forename = "B" } 

Específicamente para las consultas LINQ, puede omitir New With, pero todavía es útil para otras situaciones. No estoy seguro, sin embargo, ya que no sé VB 9 :)

+0

Según la consulta, las propiedades agregadas personalizadas que haya agregado en clases parciales u otros campos serán de solo lectura si no se devuelven en un tipo anónimo explícito, utilizando la sintaxis Seleccionar nuevo con {}. – Nathan

0

Una diferencia es que los tipos anónimos no son serializables.

2

No existe una diferencia funcional entre los dos códigos que ha enumerado. Debajo del capó, el código de ambas piezas usará un tipo anónimo para devolver los datos de la consulta.

La primera parte del código simplemente hace explícito el uso de un tipo anónimo. El motivo por el que se permite esta sintaxis es que es posible devolver cualquier tipo de una cláusula Select. Pero el tipo debe ser usado explícitamente.

Dim x = From it in SomeCollection Select New Student With { .Name = it.Name } 

Joel dice incorrectamente en su afirmación que la segunda consulta puede utilizar un tipo existente. Sin un tipo explícito, una cláusula select que utiliza un nombre de propiedad explícito siempre devolverá un tipo anónimo.

1

No hay diferencia. El compilador inferirá el tipo anónimo.

Lo más probable es que desee devolver el valor de los elementos como en e.<Surname>.Value, que devuelve una cadena en lugar de un elemento XElement.

Su segundo ejemplo podría ser simplificado como

Dim ee = From e In someXML.<Employee> _ 
     Select e.<Surname>.Value, e.<Forename>.Value 

porque el compilador también inferir los nombres de los miembros del tipo anónimo.

Sin embargo, si usted tiene la siguiente clase

Class Employee 

    Private _surname As String 
    Public Property Surname() As String 
     Get 
      Return _surname 
     End Get 
     Set(ByVal value As String) 
      _surname = value 
     End Set 
    End Property 

    Private _forename As String 
    Public Property Forename() As String 
     Get 
      Return _forename 
     End Get 
     Set(ByVal value As String) 
      _forename = value 
     End Set 
    End Property 

End Class 

entonces se podría cambiar la consulta primero para producir una IQueryable(Of Employee) en lugar del tipo anónimo mediante el uso de Nuevo ... Con este modo:

Dim ee = From e In someXML.<Employee> _ 
     Select New Employee With {.Surname = e.<Surname>.Value, _ 
            .Forename = e.<Forename>.Value} 
Cuestiones relacionadas