DateTimeOffsetをNullable <DateTimeOffset>に強制変換します

sixtstorm1

LINQクエリ式を動的に作成する関数を作成する必要があります。EqualsaDateTimeOffsetをaと比較するを作成できませんDateTimeOffset?Expression.Equalタイプを比較できないと文句を言います)。また使用する変換戦略に関係なく変換できないため、aDateTimeOffsetをaDateTimeOffset?変換して機能させるExpression.EqualことDateTimeOffsetもできません。DateTimeOffset?

MyEntity.cs:

public class MyEntity {
    public DateTimeOffset? DeliverOn;
}

Main.cs:

public void Test {
    IQueryable<MyEntity> MyEntityList = Enumerable.Empty<MyEntity>().AsQueryable();
    DateTimeOffset? dt1 = new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);
    var expr = WhereEquals(MyEntityList, t => t.DeliverOn, dt1);
}

ExpressionBuilder.cs:

public static IQueryable<TSource> WhereEquals<TSource, TValue>(IQueryable<TSource> source, Expression<Func<TSource, TValue>> selector, TValue value) {
    return source.Where(Expression.Lambda<Func<TSource, bool>>(Expression.Equal(selector.Body, Expression.Constant(value)), selector.Parameters));
}

スロー: System.InvalidOperationException: 'The binary operator Equal is not defined for the types 'System.Nullable``1[System.DateTimeOffset]' and 'System.DateTimeOffset'.'

にもかかわらずdt1であるDateTimeOffset?コンパイル時に、実行時に、C#は考えてdt1いますDateTimeOffsetこれを解決できますか?

私が試してみました:

  • DateTimeOffset? dt1 = (DateTimeOffset?)new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);
  • DateTimeOffset? dt1 = (DateTimeOffset?)(object)new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);
  • DateTimeOffset? dt1 = (DateTimeOffset?)Convert.ChangeType(new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero), typeof());

ただし、dt1はまだDateTimeOffsetです。

ダンウィルソン|

オーバーロードExpression.Constant(Object, Type)を使用して、比較に使用する値のタイプを指定します。

タイプを指定せずに、Nullable<DateTimeOffset>単ににアンラップされていますDateTimeOffset

void Main()
{
    //IQueryable<MyEntity> MyEntityList = Enumerable.Empty<MyEntity>().AsQueryable();
    var MyEntityList = new List<MyEntity>();
    MyEntityList.Add(new MyEntity { DeliverOn = new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero) });
    DateTimeOffset? dt1 = new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);
    var expr = WhereEquals<MyEntity, DateTimeOffset?>(MyEntityList.AsQueryable(), t => t.DeliverOn, (DateTimeOffset?)dt1);
    Console.WriteLine($"{expr.Count()} item(s) found");

    // Output:
    // selector.GetType() is System.Linq.Expressions.Expression`1[System.Func`2[UserQuery + MyEntity, System.Nullable`1[System.DateTimeOffset]]]
    // typeof(TValue) is System.Nullable`1[System.DateTimeOffset]
    // value.GetType() is System.DateTimeOffset
    // 1 item(s) found
}

public class MyEntity
{
    public DateTimeOffset? DeliverOn;
}

public static IQueryable<TSource> WhereEquals<TSource, TValue>(IQueryable<TSource> source, Expression<Func<TSource, TValue>> selector, TValue value)
{
    Console.WriteLine($"selector.GetType() is {selector.GetType()}");
    Console.WriteLine($"typeof(TValue) is {typeof(TValue)}");
    Console.WriteLine($"value.GetType() is {value.GetType()}");
    return source.Where(Expression.Lambda<Func<TSource, bool>>(Expression.Equal(selector.Body, Expression.Constant(value, typeof(TValue))), selector.Parameters));
}

関連しますが、受け入れられた答えExpression.Convert()は不要だと思います。

式ツリーでのNULL可能型の操作

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

DateTimeOffsetをInt64に変換し、DateTimeOffsetに戻します

分類Dev

datetimeoffsetをWebAPIに渡す

分類Dev

DateTimeOffsetを24時間制に変換するVB.NET

分類Dev

DateTimeOffsetをPostreSQLに保存する方法

分類Dev

ASP.NETMVCを使用したFullCalendarのDateTimeOffset

分類Dev

DateTimeOffset を使用した OData クエリ

分類Dev

SQLServerのdatetimeoffsetでZonedDateTimeを使用する

分類Dev

NESTDateRange述語でDateTimeOffsetを使用する

分類Dev

SQLServerとPostgresqlで文字列をdatetimeoffsetに変換する

分類Dev

C#datetimeOffsetを指定された形式に変換する方法

分類Dev

C#DateTime-DateTimeOffsetを別のTimeZoneに変換する

分類Dev

DateTimeOffsetを別のタイムゾーンに変換する方法

分類Dev

DateTimeOffset.Offsetプロパティを変更しますか?

分類Dev

TimeZoneを想定しながら、文字列をDateTimeOffsetに解析します

分類Dev

C#特定のTimeZoneの1日をDateTimeOffsetに追加します

分類Dev

DateTimeOffsetをDateTimeに変換し、このDateTimeにオフセットを追加します

分類Dev

C#DateTimeOffsetを使用せずに文字列をDateTimeに変換する

分類Dev

MySQLはDATETIMEOFFSETをサポートしますか?

分類Dev

デフォルトのDateTimeOffset値を設定しますか?

分類Dev

ローカルのDateTimeをDateTimeOffsetと比較します

分類Dev

c#DateTimeOffsetをかみそりでzulu時間に変換する

分類Dev

null許容のDateTimeOffset変数を比較する最良の方法は?

分類Dev

DocumentDbを使用してDateTimeOffsetをクエリする方法

分類Dev

PostgreSQLは完全なDateTimeOffsetを保存しません

分類Dev

DateTimeとDateTimeOffset

分類Dev

Example of ambiguous DateTimeOffset

分類Dev

DateTimeOffsetの問題

分類Dev

Passing datetimeoffset to web api

分類Dev

DatetimeOffsetとSqlite

Related 関連記事

  1. 1

    DateTimeOffsetをInt64に変換し、DateTimeOffsetに戻します

  2. 2

    datetimeoffsetをWebAPIに渡す

  3. 3

    DateTimeOffsetを24時間制に変換するVB.NET

  4. 4

    DateTimeOffsetをPostreSQLに保存する方法

  5. 5

    ASP.NETMVCを使用したFullCalendarのDateTimeOffset

  6. 6

    DateTimeOffset を使用した OData クエリ

  7. 7

    SQLServerのdatetimeoffsetでZonedDateTimeを使用する

  8. 8

    NESTDateRange述語でDateTimeOffsetを使用する

  9. 9

    SQLServerとPostgresqlで文字列をdatetimeoffsetに変換する

  10. 10

    C#datetimeOffsetを指定された形式に変換する方法

  11. 11

    C#DateTime-DateTimeOffsetを別のTimeZoneに変換する

  12. 12

    DateTimeOffsetを別のタイムゾーンに変換する方法

  13. 13

    DateTimeOffset.Offsetプロパティを変更しますか?

  14. 14

    TimeZoneを想定しながら、文字列をDateTimeOffsetに解析します

  15. 15

    C#特定のTimeZoneの1日をDateTimeOffsetに追加します

  16. 16

    DateTimeOffsetをDateTimeに変換し、このDateTimeにオフセットを追加します

  17. 17

    C#DateTimeOffsetを使用せずに文字列をDateTimeに変換する

  18. 18

    MySQLはDATETIMEOFFSETをサポートしますか?

  19. 19

    デフォルトのDateTimeOffset値を設定しますか?

  20. 20

    ローカルのDateTimeをDateTimeOffsetと比較します

  21. 21

    c#DateTimeOffsetをかみそりでzulu時間に変換する

  22. 22

    null許容のDateTimeOffset変数を比較する最良の方法は?

  23. 23

    DocumentDbを使用してDateTimeOffsetをクエリする方法

  24. 24

    PostgreSQLは完全なDateTimeOffsetを保存しません

  25. 25

    DateTimeとDateTimeOffset

  26. 26

    Example of ambiguous DateTimeOffset

  27. 27

    DateTimeOffsetの問題

  28. 28

    Passing datetimeoffset to web api

  29. 29

    DatetimeOffsetとSqlite

ホットタグ

アーカイブ