F# 如何遍历Odata实体模型图? #r“nuget:Microsoft.OData.Edm” 打开Microsoft.OData.Edm 开放系统.Xml 让reader=XmlReader.Create(“metadata.xml”) let success,edmModel,errors=Csdl.CsdlReader.TryParse(reader) 让容器=edmModel.EntityContainer 让elements=edmModel.SchemaElements |>Seq.cast |>Array.ofSeq 对于元素中的元素,请执行以下操作: printfn$“1{elem.Name}:{elem.SchemaElementKind}:{elem.Location()}” 设entitySets=container.entitySets()|>Seq.cast |>Array.ofSeq 对于实体集中的元素,请执行以下操作: 设cElems=elem.Container.Elements |>Seq.cast |>Array.ofSeq printfn$“2{elem.Name}:{elem.ContainerElementKind}” 对于塞莱姆在塞莱姆做什么 printfn$“3{celem.Name}:{celem.ContainerElementKind}”

F# 如何遍历Odata实体模型图? #r“nuget:Microsoft.OData.Edm” 打开Microsoft.OData.Edm 开放系统.Xml 让reader=XmlReader.Create(“metadata.xml”) let success,edmModel,errors=Csdl.CsdlReader.TryParse(reader) 让容器=edmModel.EntityContainer 让elements=edmModel.SchemaElements |>Seq.cast |>Array.ofSeq 对于元素中的元素,请执行以下操作: printfn$“1{elem.Name}:{elem.SchemaElementKind}:{elem.Location()}” 设entitySets=container.entitySets()|>Seq.cast |>Array.ofSeq 对于实体集中的元素,请执行以下操作: 设cElems=elem.Container.Elements |>Seq.cast |>Array.ofSeq printfn$“2{elem.Name}:{elem.ContainerElementKind}” 对于塞莱姆在塞莱姆做什么 printfn$“3{celem.Name}:{celem.ContainerElementKind}”,f#,odata,F#,Odata,这是我可以使用Microsoft.odata.Edm浏览odata实体模型图的范围。 2级和3级打印的结果相同。我想访问实体类型的键和属性 我总是可以切换到遍历XML图,但使用维护的odata库似乎是正确的做法。我认为这里的诀窍是尽可能将元素向下转换为IEdmEntityType: #r "nuget: Microsoft.OData.Edm" open Microsoft.OData.Edm open System.Xml let reader = XmlReader.

这是我可以使用Microsoft.odata.Edm浏览odata实体模型图的范围。 2级和3级打印的结果相同。我想访问实体类型的键和属性


我总是可以切换到遍历XML图,但使用维护的odata库似乎是正确的做法。

我认为这里的诀窍是尽可能将元素向下转换为
IEdmEntityType

#r "nuget: Microsoft.OData.Edm"

open Microsoft.OData.Edm
open System.Xml

let reader = XmlReader.Create("metadata.xml")
let success, edmModel, errors  = Csdl.CsdlReader.TryParse(reader)

let container = edmModel.EntityContainer
let elements = edmModel.SchemaElements |> Seq.cast<IEdmSchemaElement> |> Array.ofSeq

for elem in elements do
    printfn $"1  {elem.Name} : {elem.SchemaElementKind} : {elem.Location()}"

let entitySets = container.EntitySets() |> Seq.cast<IEdmEntitySet> |> Array.ofSeq

for elem in entitySets do
    let cElems = elem.Container.Elements |> Seq.cast<IEdmEntityContainerElement> |> Array.ofSeq
    printfn $"   2  {elem.Name} : {elem.ContainerElementKind}"

    for celem in cElems do
        printfn $"      3  {celem.Name} : {celem.ContainerElementKind}"
输出将类似于:

let entTypes =
    edmModel.SchemaElements
        |> Seq.choose (function
            | :? IEdmEntityType as entType -> Some entType
            | _ -> None)
for entType in entTypes do
    printfn "%s" entType.Name
    for prop in entType.DeclaredProperties do
        printfn "   %s %s" prop.Name (prop.Type.ShortQualifiedName())

如果我使用VisualStudio调试器,我会找到满足我需要的所有私有隐藏属性。
Product
   ID Int32
   Name String
   Description String
   ReleaseDate DateTimeOffset
   DiscontinuedDate DateTimeOffset
   Rating Int16
   Price Double
   Categories
   Supplier ODataDemo.Supplier
   ProductDetail ODataDemo.ProductDetail
FeaturedProduct
   Advertisement ODataDemo.Advertisement
ProductDetail
   ProductID Int32
   Details String
   Product ODataDemo.Product