1

WCF Data Services Web サービスからデータセットを返そうとしています。私が抱えている問題は、ランタイムまで型がわからないことです。

ここで概説されているアプローチに従いました: http://blogs.msdn.com/b/vitek/archive/2010/11/09/adding-multi-value-properties-to-untyped-providers.aspx

私は基本的に、呼び出しから DataTable からデータを返すことができる立場にあります。問題は、1 回の呼び出しですべてを取得できないことです。出力を構築するために次のコードを使用しました。

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

        ResourceSet viewsSet, viewRowsSet, viewRowValuesSet;
        this.Metadata.TryResolveResourceSet("Views", out viewsSet);
        this.Metadata.TryResolveResourceSet("ViewRows", out viewRowsSet);
        this.Metadata.TryResolveResourceSet("ViewRowValues", out viewRowValuesSet);

        IList<DSPResource> views = context.GetResourceSetEntities(viewsSet.Name);
        IList<DSPResource> viewRows = context.GetResourceSetEntities(viewRowsSet.Name);
        IList<DSPResource> viewRowValues = context.GetResourceSetEntities(viewRowValuesSet.Name);

        int viewID = 71;

        DataTable dtData = GetDataForView(viewID);

        var viewObj = new DSPResource(viewsSet.ResourceType);
        viewObj.SetValue("ViewID", viewID);
        viewObj.SetValue("ViewRows", new List<DSPResource>());
        views.Add(viewObj);

        int idx = 0;
        foreach (DataRow dr in dtData.Rows)
        {
            var viewRowObj = new DSPResource(viewRowsSet.ResourceType);
            viewRowObj.SetValue("RowID", idx);
            viewRowObj.SetValue("ViewRowValues", new List<DSPResource>());
            //viewRows.Add(viewRowObj);

            int innerIDX = 0;
            foreach (object colVal in dr.ItemArray)
            {
                var viewRowValue = new DSPResource(viewRowValuesSet.ResourceType);
                viewRowValue.SetValue("FieldName", dtData.Columns[innerIDX].ColumnName);
                viewRowValue.SetValue("FieldValue", colVal.ToString());

                ((List<DSPResource>)viewRowObj.GetValue("ViewRowValues")).Add(viewRowValue);

                innerIDX++;
            }


            ((List<DSPResource>)viewObj.GetValue("ViewRows")).Add(viewRowObj);
            idx++;                
        }


        return context;
    }


    protected override DSPMetadata CreateDSPMetadata()
    {
        DSPMetadata metadata = new DSPMetadata("LogixWCFService", "LogixWCF");

        ResourceType view = metadata.AddEntityType("View");
        metadata.AddKeyProperty(view, "ViewID", typeof(int));

        ResourceType viewRow = metadata.AddEntityType("ViewRow");
        metadata.AddKeyProperty(viewRow, "RowID", typeof(int));

        ResourceType viewRowValue = metadata.AddEntityType("ViewRowValue");
        metadata.AddKeyProperty(viewRowValue, "FieldName", typeof(string));
        metadata.AddPrimitiveProperty(viewRowValue, "FieldValue", typeof(string));          

        ResourceSet views = metadata.AddResourceSet("Views", view);
        ResourceSet viewRows = metadata.AddResourceSet("ViewRows", viewRow);
        ResourceSet viewRowValues = metadata.AddResourceSet("ViewRowValues", viewRowValue);

        metadata.AddResourceReferenceProperty(viewRow, "View", views);
        metadata.AddResourceSetReferenceProperty(view, "ViewRows", viewRows);

        metadata.AddResourceReferenceProperty(viewRowValue, "ViewRow", viewRows);
        metadata.AddResourceSetReferenceProperty(viewRow, "ViewRowValues", viewRowValues);

        return metadata;
    }

URL「http://localhost/Test.svc/Views()/ViewRows」を試すと、行のリストが表示されます。各行には ID とその行のフィールド値のコレクションがあります。Web サービスが返すのは、RowID のリストだけです。各行のコレクションを取得するには、行ごとに次の URL "http://localhost/Test.svc/Views()/ViewRows" を呼び出す必要があります。

複数のサーバー呼び出しを行うのではなく、一度にデータを返すことができるようにしたいと考えています。

これを行う方法について誰かが私を助けることができますか?

4

0 に答える 0