it-swarm-id.com

Bagaimana cara menangani CopyToDataTable () ketika tidak ada baris?

Saya punya kode:

dt = collListItems.GetDataTable().AsEnumerable()
        .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office)
         .CopyToDataTable(); 

filteredCount = dt.Rows.Count();

Bagaimana cara terbaik saya menangani acara ketika tidak ada baris yang cocok? Saat ini saya mendapatkan "Sumbernya tidak mengandung DataRows" tetapi saya ingin menetapkan filteredCount ke 0 dalam kasus itu.

Terima kasih sebelumnya.

Sunting: Saya tahu coba..catch berfungsi tetapi apakah ada cara yang lebih elegan?

31
user997685

Anda tentu tidak ingin menggunakan try/catch untuk ini. Coba/Tangkap harus digunakan dalam keadaan yang benar-benar luar biasa, Anda tidak ingin memilikinya mengendalikan aliran kontrol Anda. Di hampir semua situasi, ada metode yang lebih baik yang dibangun langsung ke bahasa/perpustakaan atau membutuhkan upaya minimal untuk kode.

Dalam hal ini, Anda ingin menangkap tabel sebelumnya sehingga Anda tidak memanggil metode GetDataTable() lebih dari yang diperlukan, karena kami akan membutuhkannya jika kueri tidak menyertakan hasil apa pun. Anda juga bisa secara opsional menyertakan ToList() pada permintaan jika permintaan itu sendiri mahal atau berjalan lama, jadi Anda hanya perlu melakukannya sekali.

Setelah itu, ini masalah pengujian jika ada ada baris dalam hasilnya. Jika demikian, Anda dapat dengan aman menyalin ke dataat. Jika tidak, cukup tirukan struktur tabel asli (tidak akan menyertakan baris), sehingga dalam kedua kasus, Anda memiliki struktur tabel yang tepat dan dapat memeriksa jumlah baris, mengikatnya ke kontrol, dll., dan tidak ada kejutan.

var table = collListItems.GetDataTable();    
var rows = table.AsEnumerable().Where(...); // optionally include .ToList();
var dt = rows.Any() ? rows.CopyToDataTable() : table.Clone();
int filteredCount = dt.Rows.Count;
67
Anthony Pegram

Kode di bawah ini berfungsi untuk saya. tolong coba

 DataRow []dataRow = dataTable.Select(query, seq);
 if (dataRow != null && dataRow.Length > 0)
 {
     return dataTable.Select(query, seq).CopyToDataTable();                                            
 }  
0
cm.goh

Bagaimana dengan solusi ini:

            DataRow[] filtered_rows = data.Tables[0].Select(filter_string);

            if(filtered_rows.Length > 0)
            {
                filtered_data = filtered_rows.CopyToDataTable();
            }
            else
            {
                filtered_data.Clear();
            }

data.Tables[0] adalah tabel sumber dan filtered_data adalah tabel yang dihasilkan.

0
Nitin Kabra

Saya pikir ini akan menjadi solusi yang lebih sederhana:

var Adj = (from c in View.AdjustmentsDataSource.AsEnumerable()
            where c["Adjustment"] != System.DBNull.Value
            select c);

if (Adj == null || Adj.Count() == 0)
     return;

DataTable dtChanges = Adj.CopyToDataTable();
0
Alek Karpov
var results = from myRow in dtL1Users.AsEnumerable()
                                          where (Convert.ToInt32(myRow["No_x0020_of_x0020_L1_x0020_Remin"]) >= Convert.ToInt32(maxL1Escalation) && Convert.ToDateTime(myRow["L2_x0020_Last_x0020_Escalated_x0"]) < DateTime.Now.Date.AddDays(-Convert.ToInt32(reminderinterval)))
                                          select myRow;

                            foreach (var v in results)
                            {
                                collEligible = results.CopyToDataTable<DataRow>();
                                break;
                            }
0
guru

anda dapat menilai terlebih dahulu apakah ada baris yang cocok:

var rows = collListItems.GetDataTable().AsEnumerable()
        .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office);
DataTable dt = table.Clone();
if (rows.Count() > 0)
    dt = rows.CopyToDataTable();
0
ojlovecd