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));
ÖrnekEğ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.
Belli bir değere sahip satırları seçip bu satırların bir sütununa erişmek için şöyle yaparız.
Örnek
Şöyle yaparız
Şöyle yaparız ancak bence hiç okunaklı değil. Satır içindeki sütuna değerine erişebiliriz.
Şöyle de yaparız.
Bu örnekte Select yerine Where kullanılıyor.
var list = dataSet.Tables[0]
.AsEnumerable()
.Where(p => p.Field<String>("EmployeeName") == "Jams");
ÖrnekBelli 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.
Linq ile Sayfalama
Sayfalama yani pagin take ve skip kullanılarak yapılabilir.
Şö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