Проверить, существует ли значение в 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;
Mservidio
источник
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 => ...

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

Blast_dan
источник