4

私はnull可能なフィールドを持っており、日付フィールドをnull可能な日時型datetimeに変換する必要があります(..を使用)...以下を使用してこれを行いました。stringExpression

 Expression.Constant(Convert.ChangeType(value, Nullable.GetUnderlyingType(memberAccess.Type)));.

memberAccess (前述) はメンバー式の型です。(LinqExtensions.cs から)コードでは、Expression.Equal メソッドを使用しています。

Expression.Equal(memberAccess, filter); 

memberaccess タイプは null 可能ですが、filter.type は null 可能ではないため、ここでは失敗します...

を使用してメンバーアクセスタイプをnullableに変換しようとしても

ConstantExpression test = Expression.Constant(Nullable.GetUnderlyingType(memberAccess.Type)),

Type は Runtime であり、DateTime ではありません。

Expression.Equalnull 許容フィールドと null 非許容フィールドを比較するにはどうすればよいですか? 文字列型を null 許容の日時フィールドに変換する方法はありますか? これのいずれかが私の問題を解決します。

4

4 に答える 4

5

わかりました..私はこのようにしました。

最初に型を変換しました(文字列から日時)

filter = Expression.Constant(
    Convert.ChangeType(value, memberAccess.Type.GetGenericArguments()[0]));

次に、この式を目的の型に変換しました

Expression typeFilter = Expression.Convert(filter, memberAccess.Type);

その後、使用Expression.Equal(memberAccess, typeFilter)...

memberAccess is MemberExpressionそしてモデルからプロパティタイプを取ります)

于 2013-05-17T14:07:13.117 に答える
0

文字列を日付に変換するには、使用するDateTime.Parseか、より良い方法を使用する必要があります。DateTime.ParseExactだから、Expression.Call

文字列が null の場合に null 日付に変換する場合は、 を使用できますExpression.Condition
結果をnull可能にしたい場合は、それExpression.Convertができると思います。

したがって、(疑似コード)のようなもの:

Condition(
    Equals(yourStringExpression, null),
    Constant(null, typeof(DateTime?)),
    Convert(
        Call(DateTime.ParseExact, yourStringExpression, ...),
        typeof(DateTime?)
    )
)
于 2013-05-17T03:08:12.430 に答える