带数据表的Linq查询
我在c#带数据表的Linq查询,linq,datatable,Linq,Datatable,我在c#中有这个数据表结果 现在我想要这样的结果: 工作1: 请问,有谁能建议我如何使用c#中的“Linq”来实现这一点吗?这可能会奏效(或者至少给你一个想法): 如果数据超过几年呢?这将是一年。老实说,我不知道林克,因为它是紧急的,我写在这里,同时我也在网上阅读另一个林克。谢谢蒂姆的快速回复。我会试着让你知道它是否有效。谢谢大家!@user1254053:编辑了我的答案。嗨,Tim,我在foreach(monthEmpGroups中的var empGroup)上收到了这个错误“指定的强制转换无
中有这个数据表结果 现在我想要这样的结果: 工作1: 请问,有谁能建议我如何使用c#中的“Linq”来实现这一点吗?这可能会奏效(或者至少给你一个想法):
如果数据超过几年呢?这将是一年。老实说,我不知道林克,因为它是紧急的,我写在这里,同时我也在网上阅读另一个林克。谢谢蒂姆的快速回复。我会试着让你知道它是否有效。谢谢大家!@user1254053:编辑了我的答案。嗨,Tim,我在foreach(monthEmpGroups中的var empGroup)上收到了这个错误“指定的强制转换无效..”。您认为这可能是因为此datatable是从excel文件导出的,并且日期是“date”类型的列,因此无法将其转换为datetime。我应该用指定的列和数据类型创建一个新的datatable,然后将这个datatable值放入这个新表中。请分享你的想法。非常感谢@user1254053:
Date
是C#中的DateTime
,您确定它不是字符串吗?然后需要使用Year=DateTime.parse(r.Field(“Date”)).Year来解析它。您可以使用调试器查看它是什么类型(tblEmpJobs.Columns[“Date”].DataType
)。您可以使用此代码将int?
默认为零:var empYearMonthCount=empYearMonthGroup.Sum(x=>{int?job1=x.Row.Field(“job1”);int-value=0;if(job1.HasValue)value=job1.value;返回值;})代码>
Date Employee Job1 Job2 Job3
1/1/2012 a 1 1 1
1/1/2012 b 2 2 2
1/1/2012 c 2 1 4
1/1/2012 d 4 2 1
1/2/2012 a 3 2 5
1/2/2012 b 2 2 2
1/2/2012 c 3 3 3
1/2/2012 d 1 1 1
1/3/2012 a 5 5 5
1/3/2012 b 2 2 6
1/3/2012 c 1 1 1
1/3/2012 d 2 3 4
2/1/2012 a 2 2 2
2/1/2012 b 5 5 2
2/1/2012 c 2 2 2
2/2/2012 a 3 3 3
2/2/2012 b 2 3 3
3/1/2012 a 4 4 2
Employee January February March
A 9 5 4
B 6 7
C 6 2
D 7
var monthEmpGroups = tblEmpJobs.AsEnumerable()
.Select(r => new
{
Row = r,
Employee = r.Field<String>("Employee"),
Year = r.Field<DateTime>("Date").Year,
Month = r.Field<DateTime>("Date").Month
})
.GroupBy(x => x.Employee);
DataTable tblMonthResultJob1 = new DataTable();
tblMonthResultJob1.Columns.Add("Employee", typeof(string));
var dtf = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat;
foreach (var empGroup in monthEmpGroups)
{
string employee = empGroup.Key;
var newRow = tblMonthResultJob1.Rows.Add();
newRow["Employee"] = employee;
var empMonthGroup = empGroup.GroupBy(mg => new { mg.Year, mg.Month });
foreach (var empYearMonthGroup in empMonthGroup)
{
int year = empYearMonthGroup.Key.Year;
int month = empYearMonthGroup.Key.Month;
string colName = string.Format("{0} {1}", dtf.GetMonthName(month), year);
if (!tblMonthResultJob1.Columns.Contains(colName))
tblMonthResultJob1.Columns.Add(colName, typeof(int));
int empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int>("Job1"));
newRow[colName] = empJob1Count;
}
}
// do the same for the other job types
DataRow totalRow = tblMonthResultJob1.Rows.Add();
totalRow["Employee"] = "ALL";
var monthGroups = tblEmpJobs.AsEnumerable()
.Select(r => new {
Row = r,
Year = r.Field<DateTime>("Date").Year,
Month = r.Field<DateTime>("Date").Month
})
.GroupBy(x => new { x.Year, x.Month });
foreach (var monthGroup in monthGroups)
{
int yearAll = monthGroup.Key.Year;
int monthAll = monthGroup.Key.Month;
string colName = string.Format("{0} {1}", dtf.GetMonthName(monthAll), yearAll);
if (!tblMonthResultJob1.Columns.Contains(colName))
tblMonthResultJob1.Columns.Add(colName, typeof(int));
int allJob1Count = monthGroup.Sum(x => x.Row.Field<int>("Job1"));
totalRow[colName] = allJob1Count;
}
empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int>("Job1"));
var empYearMonthCount = empYearMonthGroup.Sum(x =>
{
int? job1 = x.Row.Field<int?>("Job1");
int value = 0;
if(job1.HasValue) value = job1.Value;
return value;
});