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" を呼び出す必要があります。
複数のサーバー呼び出しを行うのではなく、一度にデータを返すことができるようにしたいと考えています。
これを行う方法について誰かが私を助けることができますか?