Odata 解析 $metadata
Odata Parsing $metadata
我正在托管一个 OData 服务,它公开了我的数据库中的某些 tables 和属性。
我可以使用 [hosturl]?$metadata 属性 请求数据库的元数据。
其中 return table 名称和列采用 XML 格式。
我想知道是否有内置的 OData class 来解析它,以便我可以提取表和列,还是必须手动执行?
您可以使用 ODataLib 来解析元数据模型,如下所述:
http://odata.jenspinney.com/2013/02/creating-an-iedmmodel-from-a-metadata-document/
所以我想出了一个办法,你还需要来自@Vagif 的 post 的 class,你可以在这里找到它:
http://odata.jenspinney.com/2013/02/creating-an-iedmmodel-from-a-metadata-document/
这是一个获取属性的简单函数,可以优化它以缓存表名等,但这更多是为了测试目的。
private static IEdmModel GetODataEdmModel()
{
IEdmModel edmModel = null;
string FullUrl = "http://localhost:4684/BDBWcfService.svc/$metadata/";
var request = WebRequest.CreateHttp(FullUrl);
var metadataMessage =
new ClientHttpResponseMessage((HttpWebResponse)request.GetResponse());
using (var messageReader = new ODataMessageReader(metadataMessage))
{
edmModel = messageReader.ReadMetadataDocument();
}
return edmModel;
}
public ActionResult ODataGetProperties(string TableName)
{
DataModel = (DataModel == null) ? GetODataEdmModel() : DataModel;
//gets a mapping of the tables names
var TableNames = DataModel.SchemaElements.OfType<IEdmEntityContainer>().Single().Elements.OfType<IEdmEntitySet>().ToDictionary(k => k.Name, v => v.ElementType.Name);
string TypeName = string.Empty;
if (TableNames.TryGetValue(TableName, out TypeName))
{
//uses the type name to look up the properties
var data = DataModel.SchemaElements.OfType<IEdmEntityType>().Where(k => k.Name == TypeName).Select(v => new
{
NavigationProperties = v.NavigationProperties().Select(p => p.Name).ToList(),
Properties = v.Properties().Select(p => p.Name).ToList(),
}).FirstOrDefault();
var JSSerializer = new JavaScriptSerializer();
var json = JSSerializer.Serialize(data);
return Json(data, JsonRequestBehavior.AllowGet);
}
return new HttpStatusCodeResult(HttpStatusCode.NotFound, "The Requested Table was not found please refine your query");
}
我正在托管一个 OData 服务,它公开了我的数据库中的某些 tables 和属性。
我可以使用 [hosturl]?$metadata 属性 请求数据库的元数据。 其中 return table 名称和列采用 XML 格式。
我想知道是否有内置的 OData class 来解析它,以便我可以提取表和列,还是必须手动执行?
您可以使用 ODataLib 来解析元数据模型,如下所述:
http://odata.jenspinney.com/2013/02/creating-an-iedmmodel-from-a-metadata-document/
所以我想出了一个办法,你还需要来自@Vagif 的 post 的 class,你可以在这里找到它:
http://odata.jenspinney.com/2013/02/creating-an-iedmmodel-from-a-metadata-document/
这是一个获取属性的简单函数,可以优化它以缓存表名等,但这更多是为了测试目的。
private static IEdmModel GetODataEdmModel()
{
IEdmModel edmModel = null;
string FullUrl = "http://localhost:4684/BDBWcfService.svc/$metadata/";
var request = WebRequest.CreateHttp(FullUrl);
var metadataMessage =
new ClientHttpResponseMessage((HttpWebResponse)request.GetResponse());
using (var messageReader = new ODataMessageReader(metadataMessage))
{
edmModel = messageReader.ReadMetadataDocument();
}
return edmModel;
}
public ActionResult ODataGetProperties(string TableName)
{
DataModel = (DataModel == null) ? GetODataEdmModel() : DataModel;
//gets a mapping of the tables names
var TableNames = DataModel.SchemaElements.OfType<IEdmEntityContainer>().Single().Elements.OfType<IEdmEntitySet>().ToDictionary(k => k.Name, v => v.ElementType.Name);
string TypeName = string.Empty;
if (TableNames.TryGetValue(TableName, out TypeName))
{
//uses the type name to look up the properties
var data = DataModel.SchemaElements.OfType<IEdmEntityType>().Where(k => k.Name == TypeName).Select(v => new
{
NavigationProperties = v.NavigationProperties().Select(p => p.Name).ToList(),
Properties = v.Properties().Select(p => p.Name).ToList(),
}).FirstOrDefault();
var JSSerializer = new JavaScriptSerializer();
var json = JSSerializer.Serialize(data);
return Json(data, JsonRequestBehavior.AllowGet);
}
return new HttpStatusCodeResult(HttpStatusCode.NotFound, "The Requested Table was not found please refine your query");
}