3 Ekim 2017 Salı

DataTable ve Linq

Giriş
DataTable linq'ten çok önce çıktığı için linq ile doğal bir şekilde birleşmiyor. İki tane yöntem var.
1. AsEnumerable
2. Rows.Cast<DataRow>.Select()
AsEnumerable metodu
DataTable linq ile kullanılabilir. AsEnumerable()'dan sonra çağrılan Select(), Where() vs. gibi metodlarla ile DataRow sınıfına yani tüm satıra ulaşırız.
Örnek
Tüm satırları , ile birleştirip string haline şöyle getiririz.
DataTable table = ...;

var fileLines = table
  .AsEnumerable()
  .Select(row => String.Join("  ", row.ItemArray))
  .Where(line => !String.IsNullOrWhiteSpace(line));
Örnek
Eğe4 istesek r.Field<> ile sütunlara erişmek mümkün.
List<string> years   = dataSet.Tables[0].AsEnumerable()
                            .Select(r => r.Field<string>(0))
                            .ToList();
List<double> doubles = dataSet.Tables[0].AsEnumerable()
                            .Select(r => r.Field<double>(1))
                            .ToList();
Örnek
Bu örnekte Select yerine Where kullanılıyor.
var list = dataSet.Tables[0]
  .AsEnumerable()
  .Where(p => p.Field<String>("EmployeeName") == "Jams");
Örnek
Belli bir değere sahip satırları seçip bu satırların bir sütununa erişmek için şöyle yaparız.
string logTime = dataTable.AsEnumerable()
  .Where(d => d.Field<DateTime>("LogDate").Date == new DateTime(2017, 4, 7).Date)
  .Select(s => s.Field<string>("LogTime"))
  .ToList()[1];
Cast metodu
Örnek
Şöyle yaparız
dt.AsEnumerable().Cast<object>().ToList()
Örnek
Şöyle yaparız ancak bence hiç okunaklı değil. Satır içindeki sütuna değerine erişebiliriz.
var listobj =  (EnumerableRowCollection<DataRow>) dataSet.Tables[0].Rows
  .Cast<DataRow>()
  .Where(dr => dr["EmployeeName"].ToString() == "Jams");
Örnek
Şöyle de yaparız.
dt.Rows.Cast<DataRow>().Select(row => File.Exists(row.Field<String>(columnName)))
CopyToDataTable metodu
Şöyle yaparız.
DataTable result = new DataTable();
result.Columns.Add("DateRange", typeof(string));
result.Columns.Add("Count", typeof(int));


int chunk = 2;  

result = table.AsEnumerable()
  .Select((row,i) => new {gid= i/chunk, row}) 
  .GroupBy(x=>x.gid)
  .Select(x=>  
    {
      var row= result.NewRow();

      row["DateRange"] = string.Format("{0}-{1}",
        x.First().row.Field<DateTime>("Date"),
        x.Last().row.Field<DateTime>("Date"));
      row["Count"]=  x.Sum(r=>r.row.Field<int>("R"));
      return row;
  }).CopyToDataTable<DataRow>();

Linq ile Sayfalama
Sayfalama yani pagin take ve skip kullanılarak yapılabilir.
dataTable.AsEnumerable().Skip(rowsInPage * pageNumber).Take(rowsInPage);

Hiç yorum yok:

Yorum Gönder