xdocument tutorial net example vb.net linq linq-to-xml

vb.net - tutorial - xdocument xelement example



¿Qué hace la sintaxis "Nuevo... Con" en VB Linq? (6)

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.

¿Qué (si existe) es la diferencia entre los resultados de las siguientes dos versiones de esta consulta de VB Linq?

''supongamos que tenemos un XElement que contiene los detalles del empleado definidos en otro lugar

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>

es decir, ¿cuál es el sentido de lo nuevo ... con 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.


Mi entendimiento es que no hay diferencia.

New With tiene como objetivo el uso fuera de consulta, como

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

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


No hay diferencia funcional entre las dos piezas de código que enumeró. Debajo del capó, el código de ambas piezas usará un tipo anónimo para devolver los datos de la consulta.

La primera pieza de 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 es incorrecto en su afirmación de que la segunda consulta puede usar 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.


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 XElemento.

Su segundo ejemplo podría simplificarse como

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

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

Sin embargo, si tienes 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

Luego, podría cambiar la primera consulta para producir un IQueryable(Of Employee) lugar del tipo anónimo utilizando New ... With like so:

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


Se llaman tipos anónimos .

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

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


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