0

データベースから抽出しているこの日時フィールドで構成されるLinqクエリがあります

           TerminationDate = base.ConvertFromUtcToCentral(r.TerminationDate.ToString())

使用される関数はこのように設計されています

           public DateTime ConvertFromUtcToCentral(string UtcTime)
    {

        if (UtcTime != "")
        {
            DateTime?  retValue = TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime
                                                       (UtcTime), USTimeZones.Central);

            return Convert.ToDateTime(retValue);
        }
        else
            return Convert.ToDateTime(null);

    }

しかし、null を返すたびに、このクエリを割り当てるグリッドの最小日付が表示されます。ただし、null の場合は、最小日付ではなく null を表示する必要があります。これを処理する方法を教えてください。また、三項演算子を使用する方が良いかどうかも教えてください。

制限: 複数の場所で使用されているため、関数の再実行タイプを変更できません

4

5 に答える 5

3

値型 DateTime を返すため、null を返すことはできません。null 許容の DateTime (DateTime?) を返すように関数を変更するか、例外をスローするか、DateTime の既定値である default(DateTime) を返すように変更できます。IMHO System.ArgumentException をスローします。変換する空の文字列は明らかに出力を生成しないためです。

于 2012-06-05T19:06:54.280 に答える
2

多分あなたは戻ってみることができますnull。return の関数を作成してDateTime?、代わりにreturn Convert.ToDateTime(null);行うことができますreturn null

下手な英語でごめんなさい!

于 2012-06-05T19:07:39.790 に答える
1

関数を変更できないという制限があるため、テリネリ演算子を次のようにスローできます。

TerminationDate = ( base.ConvertFromUtcToCentral(r.TerminationDate.ToString()) == default(DateTime) ? (DateTime?) null : (DateTime ?) base.ConvertFromUtcToCentral(r.TerminationDate.ToString()) );

関数を2回呼び出すので、これは好きではありません。私はおそらく、このようなことをするラッパーメソッドを書くでしょう

public static DateTime? WrapperConvertFromUtcToCentral(string UtcTime)
{
    DateTime value = ConvertFromUtcToCentral(string UtcTime);

    if (value == default(DateTime))
         return (DateTime?)null;
    else
         return (DateTime?)value;
}

TerminationDate = WrapperConvertFromUtcToCentral(r.TerminationDate.ToString())        

このようにして、元の関数を 1 回だけ呼び出します。

于 2012-06-05T19:38:12.823 に答える
1

最近の編集とコメントは、TerminationDateおそらくDateTime?. 明示的にDateTimeand値を処理し、代わりにorDateTimeを正しく返す新しいオーバーロードを追加するのでしょうか? このメソッドの戻り値の型を簡単に変更できないことがわかりました。そのため、これらの新しいオーバーロードを追加して、アプリケーションで徐々に使用することは、より良いデータ型を使用するための良いアプローチになる可能性があります。DateTimeDateTime?

public DateTime ConvertFromUtcToCentral(string UtcTime)
{
    return !string.IsNullOrEmpty(UtcTime)
        ? this.ConvertFromUtcToCentral(Convert.ToDateTime(UtcTime))
        : default(DateTime);
}

public DateTime? ConvertFromUtcToCentral(DateTime? UtcTime)
{
    return UtcTime.HasValue
        ? this.ConvertFromUtcToCentral(UtcTime.Value)
        : (DateTime?)null;
}

public DateTime ConvertFromUtcToCentral(DateTime UtcTime)
{
    return TimeZoneInfo.ConvertTimeFromUtc(UtcTime, USTimeZones.Central);
}

戻り値の型を変更しない場合はDateTime、user957902 が提案したように、s のスローを開始しない限り、常にメソッドから null 以外の値を取得する必要がありますException。:) これを使用できない場合は、消費するアプリケーションを変更して、同様に処理し、何も表示しないDateTime.MinValueようにすることもできます。null

三項演算子を使用するかどうかは好みの問題です。このような単純なケースでは、私はそれを使用するのが好きです (私の例の改行は、純粋に SO で読みやすくするためです)。峡谷を通る道は 2 つしかありません。

于 2012-06-05T20:05:06.700 に答える
0

null許容型ではないため、DateTimeにnull値を割り当てることはできませんデータベースにポストバックする際に、nullの代わりにDBNull.Valueを割り当ててみてください

于 2012-11-29T07:23:51.077 に答える