Linq实现DataTable的分组统计


DataTable dt = GetTestData(10); //获取10条测试数据
var queryByService = from r in dt.AsEnumerable()
group r by r.Field<string>(4) into g
select new
{
Service = g.Key,
Bookings = g.Count(p => p.Field<string>(1) !=""),
ConfirmedBookings = g.Count(p => p.Field<string>(1) =="Confirmed"),
PendingBookings = g.Count(p => p.Field<string>(1) =="Pending"),
CancelledBookings = g.Count(p => p.Field<string>(1) =="Cancelled")
};
var queryByClient = from r in dt.AsEnumerable()
where r.Field<string>(1) =="Confirmed"
group r by r.Field<string>(5) into g
select new
{
BookingClient = g.Key,
_20DV = g.Count(p => p.Field<string>(2)=="20DV"),
_40DV = g.Count(p => p.Field<string>(2) =="40DV"),
_40HC = g.Count(p => p.Field<string>(2) =="40HC"),
Bookings = g.Count(),
TotalOceanFreight = g.Sum(p => p.Field<decimal>(3)),
AverageOceanFreight = g.Average(p => p.Field<decimal>(3))
};
var queryByType = from r in dt.AsEnumerable()
group r by r.Field<string>(2) into g
select new
{
EquipmentType = g.Key,
Total = g.Count(),
Confirmed = g.Count(p => p.Field<string>(1) =="Confirmed"),
Pending = g.Count(p => p.Field<string>(1) =="Pending"),
Cancelled = g.Count(p => p.Field<string>(1) =="Cancelled")
};
GridView1.DataSource = dt;
GridView1.DataBind();
GridView2.DataSource = queryByService;
GridView2.DataBind();
GridView3.DataSource = queryByClient;
GridView3.DataBind(); DataTable dtByType = ConvertToDataTable(queryByType);
GridView4.DataSource = dtByType; //或 GridView4.DataSource = queryByType;
GridView4.DataBind();

另外ConvertToDataTable()是在网上看到的方法


public DataTable ConvertToDataTable<T>(IEnumerable<T> varlist)
{
DataTable dtReturn =new DataTable();
// column names
PropertyInfo[] oProps =null;
if (varlist ==null) return dtReturn;
foreach (T rec in varlist)
{
// Use reflection to get property names, to create table, Only first time, others will follow
if (oProps ==null)
{
oProps = ((Type)rec.GetType()).GetProperties();
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType;
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() ==typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
}
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
DataRow dr = dtReturn.NewRow();
foreach (PropertyInfo pi in oProps)
{
dr[pi.Name] = pi.GetValue(rec, null) ==null? DBNull.Value : pi.GetValue
(rec, null);
}
dtReturn.Rows.Add(dr);
}
return dtReturn;
}
上一篇:17-2 orm单表操作和多表操作


下一篇:第十七篇 ORM跨表查询和分组查询---二次剖析