Principales respuestas
como buscar el indice de una fila en LinQ

Pregunta
-
Tengo una duda sobre LinQ, y es la siguiente:
Después de obtener las filas de una Tabla (en este caso de la tabla de máquinas)
quisiera poder saber cómo me puedo posicionar en una fila determinada‘Obtiene los registros de la tabla Maquinas.
Public Function GetTbMaquinas(ByVal empresa As Integer) As IQueryable(Of tbMaquinas) Try Dim BD = DataContext_ElGre() Dim SQL = From Maquina In BD.tbMaquinas Where Maquina.idEmpresa = empresa Order By Maquina.Codigo Ascending Select Maquina Return SQL Catch ex As Exception Return New tbMaquinas() End Try End Function
Con ésta función recorro la tabla para buscar el índice en que se encuentra el código de la maquina.
'Busca el registro determinado por el codigo de la Maquina Public Function GetCodMaquina(ByVal Valor As Object) As Integer Dim indice As Integer = -1 Dim BD = DataContext_ElGre() Dim SQL = (From rg In BD.tbMaquinas Where rg.idEmpresa = empresa Order By rg.Codigo Ascending Select rg).ToList indice = SQL.Contains(Valor) For i = 0 To SQL.Count - 1 'Si encontramos el codigo de la maquina, asignamos el indice y nos 'salimos del bucle If SQL.ToList.Item(i).Codigo = Valor Then indice = i Exit For End If Next Return indice End Function
¿Se puede obtener este indice sin tener que hacer un bucle?
Respuestas
-
- Marcado como respuesta ribe61 miércoles, 17 de octubre de 2012 21:16
Todas las respuestas
-
No se como sera en VB pero no sera muy diferente de c#, tal que asi:
var listaMaquinas = GetTbMaquina(codigoEmpresa); //codigoEmpresa es el parametro que te llega
var maquina = listaMaquinas.FirstOrDefault(maquina => maquina.Codigo == Valor); if(maquina != null) { return listaMaquinas.IndexOf(maquina); } else { // Lo que sea }
FirstOrDefault devuelve la primera instancia de maquina que coincida con codigo y en caso contrario null.
Y luego con IndexOf obtienes la posicion de la maquina en la lista. Creo que habrá alguna forma más optima, no sé ahora mismo si IndexOf permite lambda expressions es decir el trozo de codigo dentro del metodo FirstOrDefault
Vota mi respuesta si te ha sido útil. Gracias.
- Editado David Peláez miércoles, 10 de octubre de 2012 17:52
-
Gracias David por tu respuesta, he pasado el codigo que me indicas a Vb. pero me da dos errores.
Public Function GetCodMaquina(ByVal Valor As Object) As Integer Dim listaMaquinas = GetTbMaquinas(empresa) 'codigoEmpresa es el parametro que te llegavar Dim maquina = listaMaquinas.FirstOrDefault(Function(maquina) maquina.Codigo = Valor) If maquina IsNot Nothing Then Return listaMaquinas.IndexOf(maquina) Else ' Lo que sea End If End Function
El primer error "Function(maquina)" me indica lo siguiente:
El parámetro lamdda ´maquina´ oculta una variable en un bloque de inclusión, una variable de rango definida previamente o una variable declarada de forma implicita en una expresion de consulta.
El segundo error "listaMaquinas.IndexOf(maquina)" me indica:
'IndexOff' no es un miembro de 'System.LinQ.IQueryable(Of clBDElGre_Datos.tbMaquinas)'.
-
Hola,
Sobre el primer error es debido a que el nombre de la variable ya esta usado, prueba con:
Dim maquina = listaMaquinas.FirstOrDefault(Function(maquinaItem) maquinaItem.Codigo = Valor)
Sobre el error del indice prueba con este codigo tal y como dice en el siguiente enlace, aunque igual son cosas que tiene C# y no VB
Return listaMaquinas.Position
http://stackoverflow.com/questions/2471588/how-to-get-index-using-linq
Te recomiendo este enlace para guiarte en LINQ
http://msdn.microsoft.com/es-es/library/bb397910.aspx
Vota mi respuesta si te ha sido útil. Gracias.
- Editado David Peláez viernes, 12 de octubre de 2012 8:30
-
-
Hola,
yo creo que sería mejor que usaras FindIndex
Ahora no puedo hacer la prueba pero podrías probar con algo así
Dim listaMaquinas = GetTbMaquina(codigoEmpresa) Dim index as Integer = listaMaquinas.FindIndex(Function(maquinaItem) maquinaItem.Codigo = Valor)
Ten en cuenta que index valdrá el índice en base 0 o -1 en caso de no encontrar el elemento.
Atentamente, Sergio.
Blog
Twitter- Editado sergiomf martes, 16 de octubre de 2012 7:32
-
Hola Sergio, gracias por tu respuesta.
He probado lo que me indicas pero me dice lo mismo que el mensaje anterior
'finIndex' no es un miembro de 'System.LinQ.IQueryable(Of clBDElGre_Datos.tbMaquinas)'
NO puedo creer que obtener el indice para posicionarme en la fila de una tabla tenga que ser a traves de un bucle.
un saludo.
-
- Marcado como respuesta ribe61 miércoles, 17 de octubre de 2012 21:16
-
Hola de nuevo sergiomf, lo tengo de la siguiente manera, lo unico que en el hilo anterior si me ha faltado la 'd'
Dim maquina = listaMaquinas.findIndex(Function(maquinaItem) maquinaItem.Codigo = Valor)
voy a ver tu enlace y ya te cuento.
un saludo.
-
Hola de nuevo a todos, primero daros las gracias por vuestro interes en ayurdarme. He de decir que parece ser que el siguiente codigo me funciona (digo 'parece' porque quiero hacer mas pruebas).
Public Function GetCodMaquina(ByVal Valor As Object) As Integer Dim BD = DataContext_ElGre() Dim ListaTb As New List(Of tbMaquinas) Dim SQL = (From rg In BD.tbMaquinas Where rg.idEmpresa = empresa Order By rg.Codigo Ascending Select rg).ToList ListaTb = SQL Return ListaTb.FindIndex(Function(maquinaItem) maquinaItem.Codigo = Valor) End Function