Los foros del Guille

elGuille.hosting: Ofertas de alojamiento
posiblemente los mejores precios
¡¡¡ Ahora con el doble de casi todo !!!

Si no encuentras respuesta, puedes buscar en el sitio del Guille

Google
 
Selecciona el foro y pulsa en mostrar:     Mostrar 
De tu interés (algunos de los avisos publicados)

15/mar/2006
Te recomiendo que si no entras regularmente a los foros, marques la casilla de Notificar para recibir un correo cuando alguien responda a tu mensaje.

  Foro: .NET.LINQ Cantidad:  Desde:   Hasta:    Aplicar   Responder 
Respuestas a: 39017 - Definir orden de un Select en LINQ
IDAsuntoFechaNick 
39017 Definir orden de un Select en LINQ04/03/08 22:15erickorlando   
Hola Guille:
Quiero ir al grano en este tema de Linq, me he dado cuenta de que el orden que establece el LINQ es en orden alfabetico, por ejemplo en este codigo:

Dim northwind As New NorthwindDataContext
Dim cust = From c In northwind.Customers _
Where c.CompanyName.StartsWith(txtFind.Text) _
Order By c.CustomerID, c.CompanyName, c.ContactName _
Select New With {Key .Cliente = c.CustomerID, _
Key .Compañia = c.CompanyName, _
Key .Contacto = c.ContactName}

DataGridView1.DataSource = cust

Me muestra los campos en Orden Alfabetico, x eso tuve que colocar los campos de esta manera, pero existe alguna forma de obtener un select distinto? Porque la verdad me rompo la cabeza como lograrlo y no encuentro esta informacion en el MSDN.

Gracias de antemano.

Erick ORlando © guinio
IDAsuntoFechaNick 
39019 Re: Definir orden de un Select en LINQ (Resp: 39017)04/03/08 22:45elGuille [MVP]   
No te entiendo...
¡Espera! ¿te refieres a que te ordena los campos indicados en el Select por el orden alfabético de los nombres de los campos?
Si es eso, el problema es del GridView, no de LINQ. Aunque si lo miramos "correctamente" es cosa del GridView con VB, ya que, (creo) con C# no ocurre.
El problema es que se ordenan los nombres de las propiedades del tipo anónimo que se genera en el Select.

Déjame que lo mire y te comento si encuentro algo... (seguramente lo publique en mi sitio, ya que ese tema no lo he contemplado en mi nuevo libro, ya ya no se puede incluir... je, je.

   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
39020 Re: Definir orden de un Select en LINQ (Resp: 39017)04/03/08 23:06elGuille [MVP]   
Para el que no sepa a qué se refiere erickorlando.
Cuando haces el Select de forma normal, por ejemplo:
Select c.CustomerID, c.CompanyName, c.ContactName
En el GridView las columnas no se muestran en ese orden, es decir, en ves de mostrar:
CustomerID | CompanyName | ContactName
Lo muestra así:
CompanyName | ContactName | CustomerID
Es decir, el gridView clasifica las propiedades del tipo anónimo creado en el Select y por eso erickorlando ha tenido que crear un tipo anónimo con el orden de las columnas que quiere.
En realidad el Select se podía haber creado así:
Select Cliente = c.CustomerID, _
       Compañia = c.CompanyName, _
       Contacto = c.ContactName
Y como el GridView usa las columnas por orden alfabético "del nombre de la propiedad", pues, muestra esas columnas en este orden:
Cliente | Compañia | Contacto
Es decir, no porque él haya puesto ese orden, sino porque "coincide" que de esa forma están las columnas (o propiedades del tipo anónimo) ordenadas.

Si quieres saber más de estas cosas de LINQ y VB, no puedes perderte mi nuevo libro guinio
(tengo que aprovechar cualquier ocasión para hacer publicidad, je, je)
http://www.elguille.info/NET/NovedadesVB9/Default.aspx

   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
39024 Re: Definir orden de un Select en LINQ (Resp: 39017)04/03/08 23:52elGuille [MVP]   
Creo que la única solución es que (o uses C#, je, je) o crees las columnas manualmente:
Dim cust = From c In northwind.Customers _
           Where c.CompanyName.StartsWith(txtBuscar.Text) _
           Order By c.CustomerID, c.CompanyName, c.ContactName _
           Select c.CustomerID, c.CompanyName, c.ContactName

DataGridView1.AutoGenerateColumns = False
DataGridView1.Columns.Clear()

DataGridView1.Columns.Add("CustomerID", "CustomerID")
DataGridView1.Columns.Add("CompanyName", "CompanyName")
DataGridView1.Columns.Add("ContactName", "ContactName")
DataGridView1.Columns(0).DataPropertyName = "CustomerID"
DataGridView1.Columns(1).DataPropertyName = "CompanyName"
DataGridView1.Columns(2).DataPropertyName = "ContactName"

DataGridView1.DataSource = cust
El segundo valor del método Add es lo que se muestra en la columna.
Y lo importante es la asignación a DataPropertyName, ya que ese es el nombre de la columna de los datos que quieres mostrar en esa columna. Por supuesto, ese nombre debe coincidir con el de la propiedad indicada en el Select.


Y toda esa creación de columnas, el Clear, etc. solo hay que hacerlo cuando se quieran mostrar esos datos, es decir, que si siempre vas a usar ese DataGridView con esas columnas, pues... no es necesario que lo hagas siempre, lo puedes poner en el Form_Load, por ejemplo.
Private Sub Form1_Load() Handles MyBase.Load
    DataGridView1.AutoGenerateColumns = False
    DataGridView1.Columns.Clear()

    DataGridView1.Columns.Add("CustomerID", "CustomerID")
    DataGridView1.Columns.Add("CompanyName", "CompanyName")
    DataGridView1.Columns.Add("ContactName", "ContactName")
    DataGridView1.Columns(0).DataPropertyName = "CustomerID"
    DataGridView1.Columns(1).DataPropertyName = "CompanyName"
    DataGridView1.Columns(2).DataPropertyName = "ContactName"
End Sub

Private Sub btnBuscar3_Click() Handles btnBuscar3.Click
    Dim northwind As New NorthwindDataContext

    Dim cust = From c In northwind.Customers _
               Where c.CompanyName.StartsWith(txtBuscar.Text) _
               Order By c.CustomerID, c.CompanyName, c.ContactName _
               Select c.CustomerID, c.CompanyName, c.ContactName

    DataGridView1.DataSource = cust
End Sub


   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
39028 Re: Definir orden de un Select en LINQ (Resp: 39024)05/03/08 03:02elGuille [MVP]   
He publicado un artículo con estas explicaciones y un par de proyectos, uno para Visual Basic y el otro para C#:
http://www.elguille.info/NET/dotnet/LINQ_orden_columnas_DataGridView_VB9.aspx

   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
39107 Re: Definir orden de un Select en LINQ (Resp: 39028)06/03/08 12:53erickorlando   
Mil Gracias Guille, tambien estuve pensando en eso de definir el orden de las columnas "a mano" y justo me has dado la razon, gracias por tu colaboracion.
Y creo q no sea inconveniente que no lo hayas publicado en tu libro acerca de este tema, ya que es obvio que un libro (por mas extenso que sea) jamas podra acaparar todos los "x menores" de la programacion.

Saludos desde Peru rie_gafas

Erick ORlando © guinio


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
39108 Re: Definir orden de un Select en LINQ (Resp: 39107)06/03/08 13:04elGuille [MVP]   
Sí, es que creo que no hay más alternativas (o al menos yo no las conozco), el problema de redefinir los campos del DataGridView (que también se puede hacer en modo diseño), es que debes tener cuidado de no añadir nuevas columnas, ya que entonces te las muestra todas, las que había más las que añadas.

Y sí, es prácticamente imposible añadir todos los temas en un libro... por muy electrónico que sea (por aquello de que el número de páginas no influye tanto en el precio como en uno de "papel"), je, je.


   elGuille


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.
IDAsuntoFechaNick 
39118 Re: Definir orden de un Select en LINQ (Resp: 39108)06/03/08 16:37erickorlando   
Si se puede Guille!!!, curioseando con las propiedades del DataGridView, puedes hacer lo siguiente:
Dim cust = From c In northwind.Customers _
                   Where c.CompanyName.StartsWith(txtFind.Text) _
                   Order By c.CustomerID, c.CompanyName, c.ContactName _
                   Select c.CustomerID, c.ContactName, c.ContactTitle

        dgvCust.DataSource = cust
        dgvCust.Columns("CustomerId").DisplayIndex = 0

Esa bendita propiedad DisplayIndex de una coleccion DataGridViewColumnCollection es el que determina en que orden quieres que se muestre la columna, obviamente el 0 es el primero, el 1 es el segundo y asi sucesivamente. Con esto ya me ahorro los quebraderos de cabeza por cada consulta que tendria que hacer en las distintas tablas de mi aplicación.
Gracias Guille por la "iluminacion" que sin ti no lo hubiese logrado.

Saludos desde Peru rie_gafas

Erick ORlando © guinio


Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias.

 
(c) Guillermo 'guille' Som, 2005-2017  - foros.elGuille v1.0.5.3 (23/Mar/2009 14:50 GMT +1)  - (ASP.NET 2.0 v2.0.50727.8762)
 
Usuarios activos: 44 - App. iniciada: 18/11/2017 12:49:09 GMT - La hora GMT del servidor es: 18/11/2017 19:38:29 GMT