アプリケーションのデータを照会するためのOData構文を追加したいとします。私は完全にODataControllerを実装したいのですが、ApiControllerを持っており、ここで説明したように、ODataのクエリをサポートします1つのGETアクションを実装していない:私は持っていたいもののSupporting OData Query Options in ASP.NET Web API 2クライアントとサーバーを結合せずにODataをWeb API 2に追加
例:
public class LetterEntity
{
public int Id {get; set;}
public string Title {get; set;}
public string Content {get; set;}
public string Source {get; set;}
public DateTime SendingTime {get; set;}
public string AnotherWierdString {get; set;
...
}
public class LetterDTO
{
public int Id {get; set;}
public string Title {get; set;}
public string LetterContent {get; set;}
public string Source {get; set;}
public DateTime SendingTime {get; set;}
}
public class LetterInsideFolderDTO
{
public string Title {get; set;}
public string Source {get; set;}
}
public class LettersController : ApiController
{
// Is there a way to do something like the following?:
[HttpGet]
[Route("api/letters")]
[EnableQuery]
public IQueryable<LetterInsideFolderDTO> Get(ODataQueryOptions<LetterDTO> query)
{
IQueryable<Letter> letters = db.Letters;
var queryOnEntites = // Convert the query to work on the entities somehow? - This is where I need help!!
var afterQuery = query.ApplyTo(letters)
IQueryable<LetterInsideFolderDTO> dtos = afterQuery.ProjectTo<LetterInsideFolderDTO>(afterQuery)
return dtos;
}
}
のので現時点では、クライアントクエリでEntityモデルを直接取得するという事実は、クライアントとサーバーの間に強力な結合が存在することを示しています。私はクエリを実行し、Content
フィールド内の「ABC」を持っているすべての文字を取得したい場合たとえば は、私は次のようにルーティングする必要があります。
api/letters/?$filter=contains(Content,'abc')
明日、私は「コンテンツ」からそのプロパティを変更することを決定した場合"LetterContent"にすべてのクライアントコードが壊れます。
どうすればいいですか?
私はDtoが何であるか知っています。私はDtosとAutomapperも使用しますが、それは私が尋ねたものではありません。私は何とかODataQueryOptionsを取って、それをODataQueryOptions に変換できるかどうか尋ねました。 –