2009-08-12 15 views
6

) LINQ kullanarak yeni olduğumu söylemeliyim. Aslında daha önce hiç kullanmadım, ancak bir Listeden gelecek değerleri kullanarak bir DataTable'ı filtrelemem gereken bir görevim var. Bu nedenle, LINQ'da, Listede Filtre değerleri olarak değerleri kullanarak bir Datatable üzerinde sorgulama yapılıp yapılamayacağını bilmek istiyorum. Bazıları bana biraz ipucu verebilirLINQ kullanarak bir DataSet'ten Satırlar'ı seçin, burada Satır Dizinlerinin listesi bir Listede (<T>

Teşekkür ederiz.

cevap

7

Bunu yapmanın en iyi yolu, filtrelenen sonuçlarla ne yapmayı planladığınıza bağlıdır. Daha fazla operasyon için DataTable olarak sonuçlara mı ihtiyacınız var, yoksa sonuçlara veriyor musunuz?

eşleşen datarows

//create sample table with sample rows 
DataTable table = new DataTable(); 

table.Columns.Add("id", typeof(int)); 

for (int i = 1; i < 11; i++) 
{ 
    DataRow row = table.NewRow(); 
    row[0] = i; 
    table.Rows.Add(row); 
} 

//filter the table by id (in a list) 
List<int> rowIds = new List<int> { 1, 3, 6 }; 

IEnumerable<DataRow> matchingRows = from DataRow row in table.Rows 
        where rowIds.Contains((int)row[0]) 
        select row; 

Eğer başka bir tabloya satırı içe olabilecek bir DataTable gerekiyorsa bir (Bindable) döndürür aşağıdaki örneğe, numaralandırıcıyı atın:

DataTable filteredTable = table.Clone(); 

foreach (DataRow filteredRow in matchingRows) 
{ 
    filteredTable.ImportRow(filteredRow); 
} 
+0

bir yolu .CopyToDataTable() kullanmaktır, bu durumda matchingRows.Any()() matchingRows.CopyToDataTable yapmadan önce gerçek dönerse mutlaka kontrol edin. Bu, System.Data.DataTableExtensions gerektirir – Enrico

2

Genellikle vermek LINQ hazır bir nesne olarak bir LINQ nesnesini işlemek gerektiğinde kendim uzantı yöntemleri. Örneğin, DataRowCollection (DataTowCollection) (DataTable.Rows özelliği) üzerinde, muhtemelen bir DataRows listesinden başka bir şey için kullanmadığınız bir sorguyu araştırmak istiyorsunuz. Bu dönüşümü sizin için yapan bir uzantı yöntemi yapardım (DataRowCollection - List<DataRow>). Ayrıca, bir sebepten dolayı sütun için geçersiz bir anahtar adı verilirse, bir istisna atmayı umursamadığımda değerleri güvenli bir şekilde almak için genellikle bir uzantı yöntemi kullanırım. Daha sonra, bir ints listesi olarak kimliklerini ve kimliğini içeren bir alan adını içeren bir uzantı yöntemi yaratabilirsiniz. Hepsi söylenip yapıldığında, bu bir kod satırı ile yapılır. İşte tüm uzatma yöntemlerinizi içeren sınıf. Tek bir yöntem çağrısı:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication11 
{ 
    public static class SystemDataHelpers 
    { 
     public static List<DataRow> RowList(this DataTable table) 
     { 
      List<DataRow> list = new List<DataRow>(); 
      foreach (DataRow row in table.Rows) 
       list.Add(row); 
      return list; 
     } 

     public static object GetItem(this DataRow row, string field) 
     { 
      if (!row.Table.Columns.Contains(field)) 
       return null; 
      return row[field]; 
     } 

     public static List<DataRow> GetRows(this DataTable table, List<int> ids, string fieldName) 
     { 
      Func<DataRow, bool> filter = row => ids.Contains((int)row.GetItem(fieldName)); 
      return table.RowList().Where(filter).ToList(); 
     } 
    } 
} 

(... Zaten bunları var yapmanız gereken olmaz) sizin değişkenleri ayarlamak yerine Ardından diğer, asıl çalışma bir satır kod (DÜZENLEME ile yapılır): bir datatable dönüştürmek

 DataTable table = new DataTable(); 
     List<int> rowIds = new List<int> { 1, 2, 3, 4 }; 
     string idFieldName = "row_id"; 

     List<DataRow> selected = table.GetRows(rowIds, idFieldName);