ตรวจสอบว่ามีค่าอยู่ใน dataTable หรือไม่


92

ฉันมี DataTable กับสองคอลัมน์แต่งและbookname

ฉันต้องการตรวจสอบว่าค่าสตริงที่ระบุAuthorมีอยู่แล้วใน DataTable หรือไม่ มีวิธีการตรวจสอบในตัวเช่นสำหรับ Arrays array.containsหรือไม่?


8
ลินคิว? table.Any(t => t.Author == author);
Davio

คำตอบ:


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อยู่ในคอลัมน์ของแถวใดบ้าง ฉันสามารถวนลูปทั้งหมดเพื่อค้นหา แต่มีวิธีที่ดีกว่านี้หรือไม่? -

ได้คุณสามารถใช้แบบสอบถามนี้:

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

จากสองวิธีแก้ปัญหาใดจะเร็วกว่า
Paul Alexander

1
@PaulAlexander: ไม่มีความแตกต่างมากนัก แต่DataTable.Selectไวยากรณ์แบบเก่ามีข้อ จำกัด ในขณะที่ LINQ สามารถใช้. NET framework แบบเต็มหรือวิธีการแบบกำหนดเองได้ ดังนั้นหากคุณติดอยู่กับ. NET 2 ที่คุณควรใช้DataTable.Selectไม่เช่นนั้นฉันมักจะชอบ LINQ
Tim Schmelter

หากคุณสนใจเกี่ยวกับประสิทธิภาพและมีชุดข้อมูลขนาดใหญ่tbl.Select()จะเร็วกว่าวิธีอื่น ๆ อย่างมาก
HerrimanCoder

@TimSchmelter - Great Tim. แต่ถ้าผู้ใช้ไม่ทราบชื่อคอลัมน์ แต่ยังต้องการรับทุกแถวที่ตรงกับค่าการค้นหาจะทำได้อย่างไร?
Chandan Kumar

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 System.Linq;

และเพิ่ม:

System.Data.DataSetExtensions

เพื่อการอ้างอิง


5

คุณควรจะใช้เมธอดDataTable.Select ()ได้ คุณสามารถให้เราเป็นแบบนี้

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

ฟังก์ชัน Select () ส่งคืนอาร์เรย์ของ DataRows สำหรับผลลัพธ์ที่ตรงกับคำสั่ง where


0

คุณสามารถตั้งค่าฐานข้อมูลเป็น IEnumberable และใช้ linq เพื่อตรวจสอบว่ามีค่าอยู่หรือไม่ ตรวจสอบลิงค์นี้

LINQ Query บน Datatable เพื่อตรวจสอบว่ามีการบันทึกหรือไม่

ตัวอย่างที่ให้คือ

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

คุณสามารถเสริมได้ที่ไหนด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.