2017-09-14 6 views
3

私は、データベースから、いくつかのフィールドを照会、Planstartdateは日時型であり、Planstartdateはnullにすることができ、私は "YYYY-MM-DD" にPlanstartdateをフォーマットしたい日時をフォーマットする方法は? "YYYY-MM-DD" へのタイプ

  DataTable dt = ds.Tables[0]; 
     var query = dt.AsEnumerable() 
     .Select(dr => 
     new InitOverview 
     { 
      IID = string.IsNullOrEmpty(dr.Field<string>("IID").ToString()) ? "" : dr.Field<string>("IID"), 
      ProjectName = string.IsNullOrEmpty(dr.Field<string>("ProjectName")) ? "" : dr.Field<string>("ProjectName"), 
      TeamLead = string.IsNullOrEmpty(dr.Field<string>("TeamLead")) ? "" : dr.Field<string>("TeamLead"), 
      Status = string.IsNullOrEmpty(dr.Field<string>("Status")) ? "" : dr.Field<string>("Status"), 
      OverallStatus = string.IsNullOrEmpty(dr.Field<string>("OverallStatus")) ? "" : dr.Field<string>("OverallStatus"), 
      Planstartdate = dr.Field<DateTime?>("Planstartdate"), 
      Planenddate = dr.Field<DateTime?>("Planenddate"), 
      Actualstartdate = dr.Field<DateTime?>("Actualstartdate"), 
      Actualenddate = dr.Field<DateTime?>("Actualenddate") 
     } 
     ).ToList(); 

誰でもそれを実現するのに役立つでしょうか? ありがとう

+1

FYIの式string.IsNullOrEmpty(s)? ":"は部分的に冗長であり、不必要に冗長です。あなたは、 'sを書くことによってあなたのコードをかなりきれいにすることができますか? ""または? string.Empty'のいずれかが等価です。 –

+0

[Dapper](https://github.com/StackExchange/Dapper)などのマイクロORMを利用することで、多くのコードを節約できます。手動でデータベースレコードをオブジェクトに取得するのは退屈なので、時間が無駄です。あなたはその総体のDataTableも捨てることができます。 – mason

答えて

2

変数にnull値のDateTimeが格納されていると仮定すると、nullであるかどうかを確認する必要があります。次に、基になる値にアクセスして文字列に変換できます。 Nullable typesブール型のプロパティーHasValueを用意してください。基礎となるオブジェクトで作業する前にチェックする必要があります。

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     DateTime? actualStartDate = DateTime.Now; 

     if(actualStartDate.HasValue) 
     { 
      string s = actualStartDate.Value.ToString("yyyy-MM-dd"); 
      Console.WriteLine("value: " + s); 
     }  
    } 
} 

フィドールhere

new InitOverview 
{ 
    Planstartdate = dr.Field<DateTime?>("Planstartdate").HasValue 
     ? dr.Field<DateTime?>("Planstartdate").Value.ToString("yyyy-MM-dd") : "no date"; 
} 

フィドルhere:あなたはオブジェクト初期化子内これをしたい場合は

、それはternary operatorを使用して、次のようになります。

しかし、この時点で文字列に変換することはおそらくお勧めできません。コードでは、一般的に日付を日付として残しておく必要があります。実際にユーザーに表示する必要があるため、可能な限り長くしてください。アプリケーションのビューレイヤーでのみ、実際に日付を文字列に変換する必要があります。これにより、APIをよりきれいに保ちます(これを操作するために日付に再度変換する必要はありません)。カルチャ設定に従ってユーザーに表示するための正しい形式に簡単に変換できます。

また、データベースレコードを.NETオブジェクトに退屈な配線をしています。面倒で時間の無駄です。 DapperのようなマイクロORMを使用し、これをもっときれいにする必要があります。それは次のようになります。

using (var connection = new SqlConnection(connectionString)) 
{ 
    return connection.Query<InitOverview>(selectStatement).AsList(); 
} 
+0

おかげでMason.Youは本当に私が問題を理解し、修正するのを助ける – moonwing1988

0

石工の答えは間違いなく動作します@、私はあなたがたDataTableを使用しているので、そこにあなたがデータベースからの日付を取得している場合も(と印刷にデータテーブルに変換する可能性があることを追加したいと思いますがデータベースがDBNull.Valueの場合、「HasValue」が機能しない可能性があります。したがって、フェッチしているデータにDBNull.Valueが含まれているかどうかも確認する必要があります。

new InitOverview 
{ 
    Planstartdate = dr["PlantStartDate"]!=DBNull.Value ? "Check Null condition mentioned in previous answer" : "no date"; 
} 
+0

ありがとうKaran、私はDateTimeを使用していますか? DBNull.Valueを無視するように入力します。 – moonwing1988

関連する問題