0

このデータテーブルの結果はc#にあります

Date    Employee Job1   Job2   Job3
1/1/2012    a    1      1      1 
1/1/2012    b           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/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      
2/2/2012    b    2      3      3
3/1/2012    a    4      4      2

この結果を得るには:

Job1:

Employee      January       February            March
A             9             5                   4
B             6             7
C             6             2
D             7

Linqコードは次のとおりです。

            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;
                }
            }

この行で:

int empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int>("Job1"));
I am getting error: {System.InvalidCastException: Cannot cast DBNull.Value to type 'System.int'. Please use a nullable type. 

誰かがこの問題を解決する方法を提案できますか?

4

2 に答える 2

1

データベースから返される基になる値はNULLであり、intに格納することはできません。

代わりにnull許容整数を使用してください。

int empJob1Count = empYearMonthGroup.Sum(x => x.Row.Field<int?>("Job1") ?? 0);

編集

@Philはかなり正しかった。null合体演算子の使用を参照してください。基になる値がnullの場合、代わりに0が使用されます(Sumには影響しません)。

于 2013-02-25T11:17:09.653 に答える
0

これをチェックして

 int empJob1Count = empYearMonthGroup.Where(x => x.Row["Job1"] != DBNull.value).Sum(x=>x.Row.Field<int>("Job1"));
于 2013-02-25T11:30:25.990 に答える