私は WCFサービスに対して複雑なクエリを作成する必要があるプロジェクトに取り組んでいます。linq to sqlバックエンドを使用したWCFによるDTOオブジェクトのクエリ
サービスは、バックエンドでLINQ to SQLのを使用して、データ転送に照会を投影し、このようなオブジェクト:私は何をしたいか
dbContext.GetQueryable() .Where(x => x.Id == formatId) .Select(x => FormatHelper.PopulateMSFormat(x)) .ToList();
クライアント側のクエリを指定することで、私がしたいと言うことができます特定のプロパティを持つすべてのフォーマットまたはそれらの2つのフォーマットを照会します。このスタイルで 何か:
var assets = client.QueryForAssets().Where(x => (x.name == "Test" || x == "Arne") && x.doe == "john");
IAMの私はWCF上のIQueryableを返すが、そのようなことは、ODataのサービスで行うことができることができないことに注意してください。問題は、DTOとODataを返さなければならないということです。私は、データモデルを公開するL2S-datacontextに簡単にバインドさせて、DTOは公開しません。
効率的にL2レイヤに伝播するDTOに対してクエリをシリアル化する良い方法はありますか?
私は独自のクエリ言語を書くことを考えましたが、DTOからlinqクラスへのマッピングがないため、正しい式ツリーをl2sの述語として構築するのはかなり難しいことがわかりました。
良い解決策のように思えますが、うまく動作しません。私はそれが、EFではなくL2Sを使用しているという事実と関係があると考えています –
少なくとも2つの問題が見つかりました。私はヘルパーメソッドを使用することはできませんし、コンテキストがラップされているので、コレクションが照会されたときにそれが破棄されます。 –
L2SまたはEFの使用は問題ありません。任意のソースからデータをプールできます。 ODataサービスオブジェクトは「要求ごとに」作成されるため、 'DataModel'クラスのインスタンスが要求と共に作成され、破棄されるため、' using'ステートメントが正しい方法です。 –