0

「oData」形式にアップグレードする必要がある既存のサーバー フレームワーク (WCF サービス) があります。「oData」サイトからいくつかの oData サンプルをダウンロードしました: http://www.odata.org/ecosystem

「Entity Framework」の使用を避けたいのは、多くのコードを書き直す必要があるためです。そのため、「カスタム プロバイダー」ソリューションに落ち着きました。私が見るすべての例で、何かが私を奇妙に思います:

WCF メソッドの呼び出しは、呼び出しごとにデータ モデル全体を最初から初期化する "CreateDataSource()" メソッド (コードが添付されています) を呼び出します。このデモ バージョンでは、ビジネス エンティティの 6 つのインスタンスをリロードし、それらをフィルター処理することは大したことではありませんが、実際には、それぞれ 1000 ~ 1000000 行を含む何百ものテーブルがあります。

DB全体を毎回メモリにロードしないようにするにはどうすればよいですか?? 私はおそらく何かを見逃しています。そうでなければ、このテクノロジーは役に立ちませんでした。

 protected override DSPContext CreateDataSource()
    {
        DSPContext context = new DSPContext();

        ResourceSet productsSet, categoriesSet;
        this.Metadata.TryResolveResourceSet("Products", out productsSet);
        this.Metadata.TryResolveResourceSet("Categories", out categoriesSet);
        IList<DSPResource> products = context.GetResourceSetEntities(productsSet.Name);
        IList<DSPResource> categories = context.GetResourceSetEntities(categoriesSet.Name);

        var categoryFood = new DSPResource(categoriesSet.ResourceType);
        categoryFood.SetValue("ID", 0);
        categoryFood.SetValue("Name", "Food");
        categoryFood.SetValue("Products", new List<DSPResource>());
        categories.Add(categoryFood);

        var categoryBeverages = new DSPResource(categoriesSet.ResourceType);
        categoryBeverages.SetValue("ID", 1);
        categoryBeverages.SetValue("Name", "Beverages");
        categoryBeverages.SetValue("Products", new List<DSPResource>());
        categories.Add(categoryBeverages);

        var categoryElectronics = new DSPResource(categoriesSet.ResourceType);
        categoryElectronics.SetValue("ID", 2);
        categoryElectronics.SetValue("Name", "Electronics");
        categoryElectronics.SetValue("Products", new List<DSPResource>());
        categories.Add(categoryElectronics);

        var productBread = new DSPResource(productsSet.ResourceType);
        productBread.SetValue("ID", 0);
        productBread.SetValue("Name", "Bread");
        productBread.SetValue("Description", "Whole grain bread");
        productBread.SetValue("ReleaseDate", new DateTime(1992, 1, 1));
        productBread.SetValue("DiscontinueDate", null);
        productBread.SetValue("Rating", 4);
        productBread.SetValue("Category", categoryFood);
        productBread.SetValue("BackupCategoryID", 2);
        productBread.SetValue("RelatedProductID", 1);
        products.Add(productBread);

        var productMilk = new DSPResource(productsSet.ResourceType);
        productMilk.SetValue("ID", 1);
        productMilk.SetValue("Name", "Milk");
        productMilk.SetValue("Description", "Low fat milk");
        productMilk.SetValue("ReleaseDate", new DateTime(1995, 10, 21));
        productMilk.SetValue("DiscontinueDate", null);
        productMilk.SetValue("Rating", 3);
        productMilk.SetValue("Category", categoryBeverages);
        productMilk.SetValue("BackupCategoryID", 2);
        productMilk.SetValue("RelatedProductID", 2);
        products.Add(productMilk);

        var productWine = new DSPResource(productsSet.ResourceType);
        productWine.SetValue("ID", 2);
        productWine.SetValue("Name", "Wine");
        productWine.SetValue("Description", "Red wine, year 2003");
        productWine.SetValue("ReleaseDate", new DateTime(2003, 11, 24));
        productWine.SetValue("DiscontinueDate", new DateTime(2008, 3, 1));
        productWine.SetValue("Rating", 5);
        productWine.SetValue("Category", categoryBeverages);
        productWine.SetValue("BackupCategoryID", 4);
        productWine.SetValue("RelatedProductID", 3);
        products.Add(productWine);

        ((List<DSPResource>)categoryFood.GetValue("Products")).Add(productBread);
        ((List<DSPResource>)categoryBeverages.GetValue("Products")).Add(productMilk);
        ((List<DSPResource>)categoryBeverages.GetValue("Products")).Add(productWine);

        return context;
4

1 に答える 1

0

これらは単なるサンプルです。実際のソリューションでは、データを何らかの「ストア」に格納し、そのストアに IQueryable を実装します。通常、その実装は大量のコードであり、サンプルの意図とは直接関係がないため、サンプルには含まれていません。

あなたの質問に答えるには:

  • 使用するストアに対して IQueryable 実装が必要です。これが DB の場合、データベースを CLR 空間にマップするには、何らかの ORM (EF など) が必要です。通常、その ORM は IQueryable 実装も提供します。EF の他に、NHibernate や LINQ to SQL もあります。

  • サンプルに示すようにカスタム プロバイダー コード (IDataServiceMetadataProvider、IDataServiceQueryProvider などのインターフェイスを実装) を記述し、ストアの IQueryable を GetQueryRootForResourceSet から返す必要があります (サンプルでは LINQ to Object の IQueryable 実装を使用しています)。

カスタム プロバイダーは大変な作業であることに注意してください。NHibernate や LINQ to SQL などの ORM を使用できる場合は、代わりにリフレクション プロバイダーを使用する方がはるかに高速であり、それでも機能する可能性があります。

于 2013-03-18T14:04:29.667 に答える