Wcf Odata解析$metadata

Wcf Odata解析$metadata,wcf,odata,Wcf,Odata,我正在托管一个OData服务,它从我的数据库中公开某些表和属性 我可以使用[hosturl]?$Metadata属性请求数据库的元数据。 以XML格式返回表名和列 我想知道是否有一个内置的OData类来解析它,这样我就可以抓取表和列,或者我必须手动完成吗?您可以使用ODataLib来解析元数据模型,如下所述: 所以我想出了一个方法,你还需要@Vagif的帖子中的类,你可以在这里找到: 这是一个获取属性的简单函数,可以对其进行优化以缓存表名等,但这更多是出于测试目的 private st

我正在托管一个OData服务,它从我的数据库中公开某些表和属性

我可以使用[hosturl]?$Metadata属性请求数据库的元数据。 以XML格式返回表名和列


我想知道是否有一个内置的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模型时看到过这一点,我主要是寻找用于创建用户报告服务的基于文本的信息。