2010-05-26 43 views
29

Tengo una tabla de datos. Necesito obtener un determinado valor de columna en función de la entrada del usuario. Por ejemplo, supongamos que la tabla de datos tiene dos columnas CountryID y CountryName.¿Cómo obtener un valor de columna específico de una tabla de datos?

Necesito encontrar CountryID en la tabla de datos en función del nombre del país de entrada del usuario. Podría simplemente abrir una conexión con DB y ejecutar la consulta seleccionar countryID desde Country donde countryName = @userinput. ¿Hay alguna manera de que pueda hacer esto en la tabla de datos?

Respuesta

59
string countryName = "USA"; 
DataTable dt = new DataTable(); 
int id = (from DataRow dr in dt.Rows 
       where (string)dr["CountryName"] == countryName 
       select (int)dr["id"]).FirstOrDefault(); 
+0

por supuesto, el 'DataTable' se llenaría de su DB –

+0

Evita los bucles .. muy resbaladizo! ¡gracias! –

0

supongo que se podría utilizar un objeto DataView lugar, esto permitiría entonces que usted tome ventaja de la propiedad RowFilter como se explica aquí:

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

private void MakeDataView() 
{ 
    DataView view = new DataView(); 

    view.Table = DataSet1.Tables["Countries"]; 
    view.RowFilter = "CountryName = 'France'"; 
    view.RowStateFilter = DataViewRowState.ModifiedCurrent; 

    // Simple-bind to a TextBox control 
    Text1.DataBindings.Add("Text", view, "CountryID"); 
} 
+0

Gracias, no lo he probado todavía. ¿Puedo mover el valor a una variable en lugar de vincularlo a un campo de texto? – peace

+1

No probado, pero puede probar: cadena CountryName = ver.Filas.Table [0] ["CountryName"]. ToString(); – Dal

16
foreach (DataRow row in Datatable.Rows) 
{ 
    if (row["CountryName"].ToString() == userInput) 
    { 
     return row["CountryID"]; 
    } 
} 

bien esto no puede compilar directamente debería hacerse una idea, también estoy seguro de que sería muy superior realizar la consulta a través de SQL, ya que una gran tabla de datos tardará mucho tiempo en recorrer todas las filas.

+0

Simple y directo al grano, pero como dijiste, esto puede costar mucho en el futuro. – peace

+0

En general, nada va a ser más eficiente que simplemente usar SQL, LINQ a Datatables y Datatables/Dataviews tendrán que cargar todos los registros en la memoria y luego consultarlos – Jimmy

+0

Otra opción es simplemente usar linq para sql – Jimmy

1

Las tablas de datos tienen un método .Select, que devuelve una matriz de filas según los criterios que especifique. Algo como esto:

Dim oRows() As DataRow 

oRows = dtCountries.Select("CountryName = '" & userinput & "'") 

If oRows.Count = 0 Then 
    ' No rows found 
Else 
    ' At least one row found. Could be more than one 
End If 

Por supuesto, si userinput contiene "carácter, sería lanzar una excepción (como si se consulta la base de datos). Deberías escapar de los 'caracteres (yo uso una función para hacer eso).

8

que sugieren tal manera sobre la base de los métodos de extensión:

IEnumerable<Int32> countryIDs = 
    dataTable 
    .AsEnumerable() 
    .Where(row => row.Field<String>("CountryName") == countryName) 
    .Select(row => row.Field<Int32>("CountryID")); 

System.Data.DataSetExtensions.dll necesita ser referenciado.

+1

Esto es exactamente lo que estaba buscando, ¡gracias! Casi me perdí tu último comentario sobre la referencia, gracias por eso también. – kwill

Cuestiones relacionadas