7

現在、Web APIでODataクエリ構文を使用しています。 ODataの完全な実装を実装するつもりはありません。単にクエリ構文を活用するだけです。ASP.NET Web API OData - DTOクエリをEntityクエリに変換する

通常、アプリケーションを複数のレイヤーに分割するのは、優れたアプリケーションアーキテクチャと見なされます。 最新のWebアプリケーションでは、これらのレイヤーには、データレイヤーとUI /トランスポートレイヤーが含まれています。

例えば:あなたはこのようになります(Entity Frameworkの)モデルのデータベースを持っていることがあります。

public class Employee 
{ 
    public Guid Id {get; set;} 
    public string Name {get; set;} 
    public int AccessLevel {get; set;} 
} 

が、あなたのWeb APIは、異なるワイヤフォーマットであなたの顧客にこのデータを公開することがあります。

public class EmployeeDto 
{ 
    public string Name {get; set;} 
    public string SecurityClearence {get; set;} 
} 

ASP.NET Web APIとMicrosoft ASP.NET Web API ODataライブラリを使用して、顧客がDTO形式 に対してクエリを書く方法をどのようにしたら実現できますか?

?$filter=(SecurityClearence eq 'TopSecret') 

...私たちはそれを私たちのデータフォーマットに変換します。 例:

?filter=(AccessLevel eq 007) 

か、私は動的な表現としての私のデータベースを照会することができますいくつかの他の形式。 例:

db.Employees.Where(translatedExpression); 

私は手動でこれを達成するにはいくつかの方法を考えてきたが、私は、私はこれまでのところ、私の実装を感じるので、他の人がこれを解決する方法を知っていることに熱心だ精査まで保持するのは非常に原油とはほとんどありません。

これの一部または全部を達成するWeb API ODataライブラリ(および関連するEDMライブラリ)の機能はありますか?

答えて

0

私たちは、Entity Framework、Automapper、およびLinqToQueryableの組み合わせを使用しています。

A典型的なコントローラのアクションは、次のようになります。私たちは必要な

[HttpGet] 
[LinqToQueryable] 
public IEnumerable<SomeViewModel> SomeAction() 
{ 
    return _databaseContext.Entities 
          .Where(e => e.SomeProp = "Example") 
          .Project() 
          .To<SomeViewModel>(); 
} 

nugetパッケージは、LinqToQuerystringlinqtoquerystring.entityframeworkLinqToQuerystring.WebApiました。ドキュメントはここにあります:http://linqtoquerystring.net/

+0

私はそのパッケージを見ていきたいと思います。 私は2つの理由から私が思いついたことは好きではありませんでした:1)予測がSQLで行われていたため、キーインデックスを照会しなくなりました。 2)私たちはAPIをバージョンアップしており、APIバージョンごとに異なるプロジェクションを書こうとは思わなかった。私の好みのアプローチは、データベースにヒットする前にそれらを照会することです。これははるかに難しいですが。 –

0

弊社もこれを行う予定です。私が検討している解決策の1つは、カスタムのIQueryable LINQプロバイダを作成することです。このプロバイダは、クリーンモデルをデータベースモデルに変換し、適切なフィールドでクエリを実行し、データを変換することができます。

ケーキのピース、右?ええと、私たちはまだ始まっていません。

他に提案がある場合は、お知らせください。

Walkthrough: Creating an IQueryable LINQ Provider

LINQ: Building an IQueryable Provider - Part I

2

ギャビン、

私はこのパーティーのためにあまりにも遅くなるかもしれません知っているが、ここではこの問題に関する私の2セントです。

2013年には、私はプロジェクトで作業していて、この非常に同じシナリオを考え出しました。私はエンティティモデルとDTOモデルをサービスレイヤの内外に転送する必要がありました。私は研究をしましたが、私にできるようなライブラリは見つかりませんでした:1.私のエンティティモデルから自分のDTOモデルへの自動マッピングと2. DTOのフィルタリングとソートの表現をエンティティモデルに変換します。

最終的に私は自分の「投影」フレームワークをコード化することに決めました。数ヶ月前に私はGitHubにコードを公開し、誰かがそのようなことをする必要がある場合に備えてNuGetパッケージをアップロードしました。

これを試してみる場合は、ProjectionsModel(EFコードファーストデータモデルの設定方法と同様)を構築して設定し、DTOモデルクラスをエンティティモデルにマップする方法を指定する必要があります。その後

、あなたがモデルを作成し、プロジェクトとエンティティクエリにDTOのクエリをフィルタリングするためにそれを使用することができます:

IQueryable<UserAccountEntity> usersQuery = usersList.AsQueryable(); 

var myProjectionModel = new MyProjectionModel(); 
var dtoUsersList = myProjectionModel.Project<UserAccountDTO, UserAccountEntity>(usersQuery).ToList(); 

でもタフなフィルタリングは例の一部ではない、あなたはのコレクションを作成することができますQueryFilterおよびQuerySorterのオブジェクトに変換し、パラメータとしてProjectメソッドに送信します。

このライブラリの詳細を知りたい場合はお知らせください。

+0

この作品は本当に素晴らしい作品です。どうもありがとうございます。 – user326608

関連する問題