2013-01-20 16 views
8

Ben bir datatable C# içinde bir LINQ sorgusu çalıştırıyorum.LinT on DataTable: tablonun tamamını değil, belirli bir sütunu seçin

Tüm satır yerine belirli sütunları seçmek istiyorum ve sonucu datatable olarak girin. Bunu nasıl yapabilirim??

Benim Kod:

public DataTable getConversions(string c_to, string p_to) 
{ 
    var query = from r in matrix.AsEnumerable() 
       where r.Field<string>("c_to") == c_to && 
         r.Field<string>("p_to") == p_to 
       select r; 

    DataTable conversions = query.CopyToDataTable(); 
+2

"Bir hata alıyorum": Hangi hatayı alıyorsunuz? –

+1

hata: 'AnonymousType # 1' türü, "T" türünde "T" türünde genel tür veya yöntem 'System.Data.DataTableExtensions.CopyToDataTable (System.Collections.Generic.IEnumerable )' olarak kullanılamaz. 'AnonymousType # 1' ile 'System.Data.DataRow' arasında örtük bir referans dönüşümü yoktur. –

+0

olası kopyası [LINQ sorgu ile CopyToDataTable kullanarak özel durum mu?] (Http://stackoverflow.com/questions/1072120/exception-using-copytodatatable-with-linq-query) –

cevap

8

zaten yeni bir DataTable olurdu kaç sütun önceden biliyorsanız, böyle bir şey yapabilirsiniz: İşte mainDataTable sadece üç belirli sütunları almak ve filtre kullanın

DataTable matrix = ... // get matrix values from db 

DataTable newDataTable = new DataTable(); 
newDataTable.Columns.Add("c_to", typeof(string)); 
newDataTable.Columns.Add("p_to", typeof(string)); 

var query = from r in matrix.AsEnumerable() 
      where r.Field<string>("c_to") == "foo" && 
        r.Field<string>("p_to") == "bar" 
      let objectArray = new object[] 
      { 
       r.Field<string>("c_to"), r.Field<string>("p_to") 
      } 
      select objectArray; 

foreach (var array in query) 
{ 
    newDataTable.Rows.Add(array); 
} 
+0

Bu hile yapacak. Teşekkür ederim! –

3

Kişisel select ifadesi anonim tipi, datarows değil bir dizinin bir dizi geri dönüyor. CopyToDataTable(), yalnızca T'unadresinde bulunur veya DataRow türetilmiştir. CopyToDataTable öğesini çağırmak için r satır nesnesini seçebilirsiniz.

var query = from r in matrix.AsEnumerable() 
       where r.Field<string>("c_to") == c_to && 
         r.Field<string>("p_to") == p_to 
       select r; 

DataTable conversions = query.CopyToDataTable(); 

yapabilirsiniz ayrıca implement CopyToDataTable Jenerik Tip T DataRow Değildir yere.

+0

Merhaba yazısına girin. Kodumun yanlış olduğunu biliyorum. soru, tüm satırı değil, yalnızca iki sütun seçmek için doğru yoldur. –

+0

http://msdn.microsoft.com/en-us/library/bb669096.aspx – Adil

+0

Türünü bir datarow olarak bırakabilirim, sadece belirli sütunları filtreleyebilir miyim? –

6

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable() 
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount"); 
5

DataTable, DataSet kullanarak Linq kullanarak DataSet'e ulaşmanız için size yardımcı olabilecek Access DataTable easiest way'u deneyin.

ple, varsayalım aşağıdaki gibi DataTable var.

DataTable ObjDt = new DataTable("List"); 
ObjDt.Columns.Add("WorkName", typeof(string)); 
ObjDt.Columns.Add("Price", typeof(decimal)); 
ObjDt.Columns.Add("Area", typeof(string)); 
ObjDt.Columns.Add("Quantity",typeof(int)); 
ObjDt.Columns.Add("Breath",typeof(decimal)); 
ObjDt.Columns.Add("Length",typeof(decimal)); 

İşte yukarıdaki burada orada bazı veriler vardır bu DataTable mevcut olduğunu kabul eder ve bu aşağıda gösterildiği gibi bazı verileri işleyerek özellikle Grid görünümünü bağlamak zorunda, DatTable kodudur.

Bölge | Adet | Nefes | Uzunluğu | Fiyat = Miktar * nefes * biz istediğimiz gibi bize tam bir sonuç verecektir aşağıdaki sorguyu ateşlemek zorunda Daha Uzunluk

.

var data = ObjDt.AsEnumerable().Select 
      (r => new 
      { 
       Area = r.Field<string>("Area"), 
       Que = r.Field<int>("Quantity"), 
       Breath = r.Field<decimal>("Breath"), 
       Length = r.Field<decimal>("Length"), 
       totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length")) 
      }).ToList(); 

Bu veri değişkenini Veri Kaynağı olarak atamamız gerekiyor.

5

LINQ yerine DataTable daha Listelerinde kullanımı çok etkili ve kolay ... alabileceğimiz bu basit Linq sorgusu kullanarak

bizim tamamı kabul ve ayrıca bu tüm diğer LINQ sorguları gerçekleştirebilirsiniz. Yukarıdaki cevapların tercih etmeyeceğim bir döngü (foreach for) olduğunu görebiliyorum.

Veri Tabanı'ndan bir sütun sütunu seçmenin en iyi yolu, yalnızca sütunu süzmek ve istediğiniz şekilde kullanmak için bir DataView kullanmaktır.

Nasıl yapılacağını buradan öğrenin.

DataView dtView = new DataView(dtYourDataTable); 
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA"); 

Şimdi DataTable dtTableWithOneColumn yalnızca bir sütun (kolumna) içerir.

İlgili konular