Проверить, существует ли значение в dataTable?


92

У меня есть DataTable с двумя столбцами Автор и Имя книги .

Я хочу проверить, существует ли данное строковое значение Author в DataTable. Есть ли какой-нибудь встроенный метод для проверки, например, для массивов array.contains?


8
LINQ? table.Any(t => t.Author == author);
Давио

Ответы:


206

Вы можете использовать LINQ-to-DataSetс Enumerable.Any:

String author = "John Grisham";
bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));

Другой подход - использовать DataTable.Select:

DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'");
if(foundAuthors.Length != 0)
{
    // do something...
}

Вопрос: что, если мы не знаем заголовки столбцов и хотим узнать, существует ли какое-либо значение ячейки PEPSIв каких-либо столбцах row'c? Я могу зациклить все это, чтобы узнать, но есть ли способ лучше? -

Да, вы можете использовать этот запрос:

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));

Добавьте их System.Data.DataSetExtensionsв справочник и using System.Linq;в класс использования
5377037

Что из двух решений будет быстрее?
Пол Александр

1
@PaulAlexander: большой разницы нет. Но старый DataTable.Selectсинтаксис ограничен, тогда как LINQ может использовать полную платформу .NET или настраиваемые методы. Так что, только если вы застряли на .NET 2, вы должны использовать его DataTable.Select, иначе я бы всегда предпочел LINQ
Тим Шмелтер,

Если вы заботитесь о производительности и имеете большие наборы данных, tbl.Select()это значительно быстрее, чем другие подходы.
HerrimanCoder

@TimSchmelter - Великий Тим. Но если пользователь не знает имени столбца, но все еще хочет получить все строки, соответствующие поисковому значению, как это можно сделать?
Чандан Кумар,

13

Вы можете использовать Linq. Что-то типа:

bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;

8
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}

добавьте в свой раздел using:

using System.Linq;

и добавить :

System.Data.DataSetExtensions

к ссылкам.


5

У вас должна быть возможность использовать метод DataTable.Select () . Вы можете нам это вот так.

if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0)
    ...

Функция Select () возвращает массив строк данных для результатов, соответствующих оператору where.


0

вы можете установить базу данных как IEnumberable и использовать linq, чтобы проверить, существуют ли значения. проверьте эту ссылку

LINQ Query on Datatable, чтобы проверить, существует ли запись

приведенный пример

var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...

Вы можете дополнить где угодно

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.