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}”
这是我可以使用Microsoft.odata.Edm浏览odata实体模型图的范围。 2级和3级打印的结果相同。我想访问实体类型的键和属性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.
我总是可以切换到遍历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