2011-01-11 23 views
3

Entity Frameworkを介してデータベースからクエリされたオブジェクトを返すWCFサービスを作成する必要があります。私が読んだ記事のほとんどは、それぞれのタイプのクエリに対してメソッドを作成する必要があることを示しています。しかし、私は、これは例えば、私が作成する方法の数が爆発の原因となると思う:Entity Framework 4 LINQ to Entities WCFでのクエリ

  • GetAllCars()
  • GetCarsByBrand(文字列の新しい名称)
  • GetCarsByYear(int型年)
  • GetCarsByBrandAndYear(文字列の新しい名称、int型年)
  • GetCarsByTireSize(tireSizeフロート)
  • GetCarsByEngineType(文字列engineType)
  • GetCarsByEngineSizeAndタイプ(文字列engineTypeをengineSizeフロート)
  • GetCarsByEngineSizeBetween(upperEngineSizeフロート、lowerEngineSizeフロート)
  • など。その上で

新しいクエリが必要な場合は、その後、私が作成する必要がありますそれを上回る新しい方法。

これを行うにはもっと一般的な方法が必要です。理想的なのは、クライアントがLINQを介して式ツリーを作成し、WCFを介して送信し、次にエンティティフレームワークを介してクエリを実行できるかどうかです。次に、すべてのクエリをサポートする1​​つの方法があります。

  • QueryCars(式expression)

または文字列として式を送信します:たとえば

    (文字列式)

がどのように開発者はこれを解決した

  • QueryCars柔軟なクエリの問題?

    私は現在.NET 4.0で作業しています。これは単なる内部アプリなので、セキュリティは本当に懸念されていません。

  • 答えて

    3

    あなたが探しているのはWCF Data Servicesです。 Linqでデータを照会するためにODataプロトコルを使用します。 Stack Overflow OData service

    例:上記のコードで

    var query = from u in service.Users 
          orderby u.Reputation descending 
          select u; 
    
    Console.WriteLine ("Top ten Stack Overflow users"); 
    foreach (var u in query.Take(10)) 
    { 
        Console.WriteLine ("{0}: {1}", u.DisplayName, u.Reputation); 
    } 
    

    は、service.Usersを使用すると、式ツリーでそれを照会することができますタイプIQueryable<User>、です。

    LINQPadを使用してSOサービスを簡単に試すか、VSプロジェクトのサービスURLへの参照を追加することで簡単に試すことができます。

    +0

    これは私が探している答えのようです。好奇心のため、WCFデータサービスの前にこの問題がどのように解決されましたか? – Mas

    +0

    これについて少しお読みになった後、これも遅延ロードをサポートするかどうかは不明です。遅延読み込みが自動的に処理されるかどうか知っていますか? – Mas

    +0

    @Mas:それ以前は、ADO.NET Data ServicesやAstoriaと呼ばれていましたが、Linqは存在しません;) –

    3

    純粋なWCFサービスは必要ありませんが、代わりにWCF Data Servicesと記述してください。データサービスはexposing IQueryableを許可し、クライアントでLinqクエリを定義します。

    関連する問題