jpavlov
jpavlov

Reputation: 2261

Setting DateTime property to null

So I have this property and would like to either set the value to what is coming back from the db or to null if it is empty. It is possible to do this with an if-else, but for cleaner code, I would like to use the ternary operator. Could someone point out the mistake I am making. Thanks!!!

public DateTime? OptionExpiration {get;set;}
 //actually sets the value to null               
 if(String.IsNullOrEmpty(dr["OPTION_EXPIRATION"].ToString())){
      OptionExpiration = null;
}else{
      OptionExpiration = DateTime.Parse(dr["OPTION_EXPIRATION"].ToString());
}

//so I check the to see if the string is empty or null, then try to set the value but recieve this error: Error 2 Operator '|' cannot be applied to operands of type '' and 'System.DateTime?'

String.IsNullOrEmpty(dr["OPTION_EXPIRATION"].ToString())
? OptionExpiration =  null
| OptionExpiration = DateTime.Parse(dr["OPTION_EXPIRATION"].ToString())
;

Upvotes: 0

Views: 256

Answers (2)

Patrick Hofman
Patrick Hofman

Reputation: 156998

You are using the ternary operator wrong.

It should be:

OptionExpiration = String.IsNullOrEmpty(Convert.ToString(dr["OPTION_EXPIRATION"]))
                   ? (DateTime?)null
                   : DateTime.Parse(dr["OPTION_EXPIRATION"].ToString())
                   ;

So:

assignment = condition ? trueExpression : falseExpression;

If the field is a date in your database, it might be better to do this:

OptionExpiration = Convert.IsDBNull(dr["OPTION_EXPIRATION"])
                   ? (DateTime?)null
                   : (DateTime)dr["OPTION_EXPIRATION"]
                   ;

Upvotes: 6

Darren Gourley
Darren Gourley

Reputation: 1808

I would use an extension method like this:

            public static Nullable<DateTime> AsNullableDateTime(this object item, Nullable<DateTime> defaultDateTime = null)
            {
                if (item == null || string.IsNullOrEmpty(item.ToString()))
                    return defaultDateTime;

                DateTime result;
                if (!DateTime.TryParse(item.ToString(), out result))
                    return defaultDateTime;

                return result;
            }

You can pass anything in to this and it will attempt to give you back a date. If it fails for whatever reason (this also checks to make sure the object you send through is not null) you will get a null back; which is fine because you're mapping to a nullable datetime.

To use this you would do something like:

OptionExpiration = dr["OPTION_EXPIRATION"].AsNullableDateTime();

No mess, easy to understand what is happening, abstracting away the clutter, and highly reusable on other parts of your solution.

Upvotes: 0

Related Questions