2017-02-28 5 views
1

DateTimeTimeZoneInfoを表す独自の構造体を定義しましたので、タイムゾーンに関する情報を保持しながらUTC時間で作業できます。Web Api ODataカスタムタイプのクエリ

これらのオブジェクトをODataクエリで取得したいのですが、このタイプのプロパティで$orderbyを使用しようとすると失敗します。 $orderBy=Timestamp/Value/UniversalTimeを質問したところ結果が得られましたが、私はちょうど$orderBy=Timestamp

このタイプのコレクションを注文する可能性はありますか?

public struct DateTimeWithZone : IComparable<DateTime>, IComparable<DateTimeWithZone>, IFormattable 
{ 
    private readonly DateTime _utcDateTime; 
    private readonly TimeZoneInfo _timeZone; 

    public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone) 
    { 
     if (timeZone == null) 
     { 
      throw new NoNullAllowedException(nameof(timeZone)); 
     } 

     _utcDateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc); 
     _timeZone = timeZone; 
    } 


    ... 
} 
次のように定義されたモデルで

public class ClientViewModel 
{ 
    public string Name { get; set; } 
    public DateTimeWithZone? Timestamp { get; set; } 
} 

をそして、これは、使用されている方法です:私たちは、複雑な型を持ついくつかの同様の問題があった

public IHttpActionResult GetAll(ODataQueryOptions<ClientViewModel> options) 
    { 
     var fromService = _clientsClient.GetAllClients().MapTo<ClientViewModel>(MappingStrategy).AsQueryable(); 
     var totalCount = fromService.Count(); 
     var results = options.ApplyTo(fromService); // <-- Fails here 

     return Ok(new PageResult<ClientViewModel>(
      results as IEnumerable<ClientViewModel>, 
      Request.ODataProperties().NextLink, 
      totalCount)); 
    } 

The $orderby expression must evaluate to a single value of primitive type.

答えて

0

で失敗注文する。多分あなたのシナリオでもこれが助けになるかもしれません。 extneralモデル(ODATA)と(我々の場合でEntityFramework)内部モデル を分離

  1. 書き換えODataQueryOptions
  2. :(ないと100%同一である)私たちのケースでは、2段階アプローチを使用します

    ODataQueryOptionsの書き換え

    $orderBy=Timestamp/Value/UniversalTimeという形式が受け入れられ、ODATAによって適切に処理されます。したがって、基本的には値$orderbyを抽出し、作業形式で再挿入することで値を書き換えることができます。

    私の投稿Modifying ODataQueryOptions on the fly(完全なコードが含まれています)でこれを行う方法について2つの方法が説明されています。既存のオプションは、新しいUriを構築することによって新しいオプションを作り直します。あなたの場合、タイムスタンプ$orderBy=Timestampから抽出し、$orderBy=Timestamp/Value/UniversalTimeとして再挿入します。

    の分離外部および内部モデル

    加えて、我々は公共の対面APIおよび内部/永続化層のための2つのモデルを使用していました。内部では、異なるプロパティを使用してナビゲーションプロパティ(公共側にのみ存在する)にグループ化しました。このアプローチでは、ユーザーは$expand=VirtualNavigationProperty/TimeZoneInfo$orderby=...でオプションを指定できます。内部的には複合データ型を使用する必要はありませんが、すでにその情報を保持しているDateTimeOffsetをそのまま使用してください。あなたのように、コントローラでのクエリオプションを書き換えるのに十分であるべきで、あなたの質問によると

    :私は次のポストでの仮想ナビゲーションプロパティのこの分離とマッピングを説明しました形式が既に期待どおりに機能しており、より便利なクエリ構文が必要なことを言及しました。

    よろしくお願いします。ロナルド

関連する問題