Tengo DataTable con dos columnas Author y Bookname .
Quiero verificar si el valor de cadena dado Autor ya existe en el DataTable. ¿Hay algún método incorporado para verificarlo, como para las matrices array.contains?
P: ¿qué PEPSIpasa si no conocemos los encabezados de las columnas y queremos saber si existe algún valor de celda en alguna fila de columnas? Puedo recorrerlo todo para averiguarlo, pero ¿hay una manera mejor? -
Agregue estos System.Data.DataSetExtensionspara referencia y using System.Linq;para usar la clase
5377037
De las dos soluciones, ¿cuál sería más rápida?
Paul Alexander
1
@PaulAlexander: no hay una gran diferencia. Pero la DataTable.Selectsintaxis anterior es limitada, mientras que LINQ puede usar el marco .NET completo o métodos personalizados. Entonces, solo si está atascado en .NET 2, debe usar DataTable.Select; de lo contrario, siempre preferiría LINQ
Tim Schmelter
Si le preocupa el rendimiento y tiene grandes conjuntos de datos, tbl.Select()es mucho más rápido que los otros enfoques.
HerrimanCoder
@TimSchmelter - Gran Tim. Pero si el usuario no conoce el nombre de la columna, pero aún desea obtener todas las filas que coinciden con el valor de búsqueda, ¿cómo se puede hacer?
table.Any(t => t.Author == author);
Respuestas:
Puede usar
LINQ-to-DataSet
conEnumerable.Any
:String author = "John Grisham"; bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));
Otro enfoque es utilizar
DataTable.Select
:DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'"); if(foundAuthors.Length != 0) { // do something... }
Sí, puede utilizar esta consulta:
DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray(); bool anyFieldContainsPepsi = tbl.AsEnumerable() .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));
fuente
System.Data.DataSetExtensions
para referencia yusing System.Linq;
para usar la claseDataTable.Select
sintaxis anterior es limitada, mientras que LINQ puede usar el marco .NET completo o métodos personalizados. Entonces, solo si está atascado en .NET 2, debe usarDataTable.Select
; de lo contrario, siempre preferiría LINQtbl.Select()
es mucho más rápido que los otros enfoques.Puede utilizar Linq. Algo como:
bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;
fuente
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name"); if (rw != null) { // row exists }
agregar a su cláusula de uso:
using System.Linq;
y añadir :
a las referencias.
fuente
Debería poder utilizar el método DataTable.Select () . Puedes hacerlo así.
if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0) ...
La función Select () devuelve una matriz de DataRows para los resultados que coinciden con la instrucción where.
fuente
puede configurar la base de datos como IEnumberable y usar linq para verificar si los valores existen. mira este enlace
Consulta LINQ en la tabla de datos para comprobar si existe un registro
el ejemplo dado es
var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...
podrías complementar donde con cualquier
fuente