0

linq クエリで例外を処理するにはどうすればよいですか? たとえば、次のクエリがあるとします。

var query = (from d in GetLHDb().daily_average
             where d.findnsave_site_id == fnsID 
                   && d.test_path_id == pathId 
                   && d.date > nTimesDays 
                   && d.date <= yesterday
             select new
             {
                 loadtime = d.loadtime,
                 created_at = d.date
             }).ToArray();

たとえば、クエリ内で null 例外を処理するにはどうすればよいですか? 私はオンラインで検索しましたが、それらの多くは VB 用です。

4

3 に答える 3

1
try
{
    var query = (from d in GetLHDb().daily_average
    where d.findnsave_site_id == fnsID && d.test_path_id == pathId && d.date > nTimesDays && d.date <= yesterday
    select new { loadtime = d.loadtime, created_at = d.date }).ToArray();
}
catch (NullReferenceException e)
{
    ReportError();
}
于 2012-06-22T18:49:22.317 に答える
1

あなたの場合、あなたがあなたのコードの他の場所と同じように。ブロック.ToArray()で包みます。try/catchあなたの場合、私はもっと防御的で、null値を適切に処理しますが。

try
{
    var query = (from d in GetLHDb().daily_average
    where d.findnsave_site_id == fnsID && d.test_path_id == pathId && d.date >                           nTimesDays && d.date <= yesterday
select new { loadtime = d.loadtime, created_at = d.date }).ToArray();
}
catch (Exception)
{
  //do what you need to
}
于 2012-06-22T18:49:31.063 に答える
1

あなたの例では、null 参照の例外が発生する可能性のある 3 つの場所を見ています。それは、GetLHDb().daily_averageGetLHDB が null の場合にアクセスすること、null を列挙しようとdaily_averageすること、または null の場合にフィールドにアクセスしようとするdことです (私はこれが起こる可能性があるかどうかさえわかりません)。

GetLHDb()の結果をローカル変数 (たとえば、 ) に保存してからlhdb、null チェックを行うことをお勧めします。null でない場合は、 nll check-on を実行しlhdb.daily_averageます。それが null でない場合は、クエリを続行します。

更新:さらに、dnull の場合は、where 句を . で開始できますd != null

var lhdb = GetLHDb();
if(lhdb != null && lhdb.daily_average != null)
{
    var query = (from d in lhdb.daily_average
                 where d != null // If d can't be null, remove this
                       && d.findnsave_site_id == fnsID 
                       && d.test_path_id == pathId 
                       && d.date > nTimesDays 
                       && d.date <= yesterday
                 select new
                 {
                     loadtime = d.loadtime,
                     created_at = d.date
                 }).ToArray();

    // Process the results
}
于 2012-06-22T18:59:34.890 に答える