Wcf Odata解析$metadata
我正在托管一个OData服务,它从我的数据库中公开某些表和属性 我可以使用[hosturl]?$Metadata属性请求数据库的元数据。 以XML格式返回表名和列Wcf Odata解析$metadata,wcf,odata,Wcf,Odata,我正在托管一个OData服务,它从我的数据库中公开某些表和属性 我可以使用[hosturl]?$Metadata属性请求数据库的元数据。 以XML格式返回表名和列 我想知道是否有一个内置的OData类来解析它,这样我就可以抓取表和列,或者我必须手动完成吗?您可以使用ODataLib来解析元数据模型,如下所述: 所以我想出了一个方法,你还需要@Vagif的帖子中的类,你可以在这里找到: 这是一个获取属性的简单函数,可以对其进行优化以缓存表名等,但这更多是出于测试目的 private st
我想知道是否有一个内置的OData类来解析它,这样我就可以抓取表和列,或者我必须手动完成吗?您可以使用ODataLib来解析元数据模型,如下所述:
所以我想出了一个方法,你还需要@Vagif的帖子中的类,你可以在这里找到: 这是一个获取属性的简单函数,可以对其进行优化以缓存表名等,但这更多是出于测试目的
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");
}
private静态IEdmModel getODataedModel()
{
IEdmModel edmModel=null;
字符串FullUrl=”http://localhost:4684/BDBWcfService.svc/$metadata/”;
var request=WebRequest.CreateHttp(FullUrl);
var metadataMessage=
新的clienthttppresponseMessage((HttpWebResponse)request.GetResponse());
使用(var messageReader=new ODataMessageReader(metadataMessage))
{
edmModel=messageReader.ReadMetadataDocument();
}
返回模型;
}
公共操作结果ODataGetProperties(字符串表名)
{
DataModel=(DataModel==null)?GetODataedModel():DataModel;
//获取表名称的映射
var TableNames=DataModel.SchemaElements.OfType().Single().Elements.OfType().ToDictionary(k=>k.Name,v=>v.ElementType.Name);
string TypeName=string.Empty;
if(TableNames.TryGetValue(TableName,out TypeName))
{
//使用类型名称查找属性
var data=DataModel.SchemaElements.OfType()。其中(k=>k.Name==TypeName)。选择(v=>new
{
NavigationProperties=v.NavigationProperties().Select(p=>p.Name).ToList(),
Properties=v.Properties().Select(p=>p.Name).ToList(),
}).FirstOrDefault();
var JSSerializer=新的JavaScriptSerializer();
var json=JSSerializer.Serialize(数据);
返回Json(数据,JsonRequestBehavior.AllowGet);
}
返回新的HttpStatusCodeResult(HttpStatusCode.NotFound,“未找到请求的表,请优化查询”);
}
感谢我以前在创建Edm模型时看到过这一点,我主要是寻找用于创建用户报告服务的基于文本的信息。