Mam DataTable z dwiema kolumnami Autor i Bookname .
Chcę sprawdzić, czy podana wartość ciągu Autor już istnieje w DataTable. Czy jest jakaś wbudowana metoda sprawdzania tego, jak w przypadku tablic array.contains?
P: co się stanie, jeśli nie znamy kolumn Nagłówki i chcemy sprawdzić, czy jakakolwiek wartość komórki PEPSIistnieje w kolumnach z wierszami? Mogę to wszystko zapętlić, aby się dowiedzieć, ale czy jest lepszy sposób? -
Dodaj je System.Data.DataSetExtensionsdo odniesienia i using System.Linq;do korzystania z klasy
5377037
Które z tych dwóch rozwiązań byłoby szybsze?
Paul Alexander
1
@PaulAlexander: nie ma wielkiej różnicy. Ale stara DataTable.Selectskładnia jest ograniczona, podczas gdy LINQ może używać pełnej platformy .NET lub metod niestandardowych. Więc tylko jeśli utkniesz na .NET 2, powinieneś użyć DataTable.Select, w przeciwnym razie zawsze wolałbym LINQ
Tim Schmelter
Jeśli zależy Ci na wydajności i masz duże zbiory danych, tbl.Select()jest znacznie szybszy niż inne podejścia.
HerrimanCoder
@TimSchmelter - Świetny Tim. Ale jeśli użytkownik nie zna nazwy kolumny, ale nadal chce uzyskać wszystkie wiersze pasujące do wyszukiwanej wartości, jak można to zrobić?
table.Any(t => t.Author == author);
Odpowiedzi:
Możesz używać
LINQ-to-DataSet
zEnumerable.Any
:String author = "John Grisham"; bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));
Innym podejściem jest użycie
DataTable.Select
:DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'"); if(foundAuthors.Length != 0) { // do something... }
Tak, możesz użyć tego zapytania:
DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray(); bool anyFieldContainsPepsi = tbl.AsEnumerable() .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));
źródło
System.Data.DataSetExtensions
do odniesienia iusing System.Linq;
do korzystania z klasyDataTable.Select
składnia jest ograniczona, podczas gdy LINQ może używać pełnej platformy .NET lub metod niestandardowych. Więc tylko jeśli utkniesz na .NET 2, powinieneś użyćDataTable.Select
, w przeciwnym razie zawsze wolałbym LINQtbl.Select()
jest znacznie szybszy niż inne podejścia.Możesz użyć Linq. Coś jak:
bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;
źródło
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name"); if (rw != null) { // row exists }
dodaj do swojej klauzuli using:
using System.Linq;
i dodaj :
do referencji.
źródło
Powinieneś móc użyć metody DataTable.Select () . Możesz nam to w ten sposób.
if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0) ...
Funkcja Select () zwraca tablicę DataRows dla wyników zgodnych z instrukcją where.
źródło
możesz ustawić bazę danych jako IEnumberable i użyć linq, aby sprawdzić, czy wartości istnieją. sprawdź ten link
Zapytanie LINQ w Datatable, aby sprawdzić, czy rekord istnieje
podany przykład to
var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...
możesz uzupełnić gdziekolwiek
źródło