0

以下に示すようなLinqクエリがあります

var ResultQuery = from Task in dtTasks.AsEnumerable()
                              select new { EmployeeName = Task.Field<string>("EmpName").Split(':')[1],
                                           EmployeeCode = Task.Field<string>("EmpName").Split(':')[0],
                                           ProjectId = Task.Field<string>("ProjectName").Split(':')[0],
                                           ProjectName = Task.Field<string>("ProjectName").Split(':')[1],
                                           TaskName = Task.Field<string>("TaskName"),
                                           TaskDescription = Task.Field<string>("TaskDescription"),
                                           StartDate = Task.Field<DateTime>("StartDate"),
                                           Duration = Task.Field<double>("Duration"),
                                           EndDate = Task.Field<DateTime>("EndDate"),
                                           LeadName = Task.Field<string>("LeadBy").Split(':')[1],
                                           LeadId = Task.Field<string>("LeadBy").Split(':')[0]
                              };

foreach (var task in ResultQuery)
            {

            }

dtTasksMicrosoft Excel ファイルからインポートされたテーブルです。これはユーザー入力ファイルであるため、多くのタイプミスがある可能性があります。String.SplitLinq Query では、DateTime 変換が失敗した場合、またはオブジェクト参照がインスタンス エラー (空白または空の行が挿入されたときのメソッド) に設定されていない場合、どのように処理できますか? それらの繰り返しをスキップし、スキップする理由についてユーザーに警告を発したいと思います。これにLinqを使用した場合、どうすればこれを達成できますか?

4

1 に答える 1

0

列挙型は、例外が発生するとすぐに壊れます。これ以上繰り返すことはできません。

以下は回避策です。

var ResultQuery = dtTasks.AsEnumerable()
                  .Select(Task => {
                              try {  
                                  return new { EmployeeName = Task.Field<string>("EmpName").Split(':')[1],
                                           EmployeeCode = Task.Field<string>("EmpName").Split(':')[0],
                                           ProjectId = Task.Field<string>("ProjectName").Split(':')[0],
                                           ProjectName = Task.Field<string>("ProjectName").Split(':')[1],
                                           TaskName = Task.Field<string>("TaskName"),
                                           TaskDescription = Task.Field<string>("TaskDescription"),
                                           StartDate = Task.Field<DateTime>("StartDate"),
                                           Duration = Task.Field<double>("Duration"),
                                           EndDate = Task.Field<DateTime>("EndDate"),
                                           LeadName = Task.Field<string>("LeadBy").Split(':')[1],
                                           LeadId = Task.Field<string>("LeadBy").Split(':')[0]
                                  }
                               } catch(Exception e) {
                                        Console.WriteLine("Print your warning!");
                                        return null;
                               }
                  });



foreach (var task in ResultQuery)
{
   if(task != null) {
        // do your processing
   }
}
于 2013-10-16T05:53:36.477 に答える