f# - 如何遍历 Odata 实体模型图?
问题描述
#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}"
这是我可以使用 Microsoft.OData.Edm 遍历 odata 实体模型图的程度。2 级和 3 级打印的结果是相同的。我想访问实体类型的键和属性。
我总是可以切换到走 XML 图,但使用维护的 odata 库似乎是正确的做法。
解决方案
我认为这里的诀窍是尽可能将元素向下转换IEdmEntityType
:
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())
输出将类似于:
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
推荐阅读
- azure - 数据流无法从源 .csv azure 捕获行更改
- python - Tensorflow 模型不进行多分类训练
- javascript - 如何提取文本值并将其分配给赛普拉斯范围之外的变量
- json - 如何处理来自在pytest中导入的Json的null
- c# - 在网站之间共享 cookie
- nginx - NGINX 将端点或 URL 限制为特定 IP
- php - 在 PHP 中使用 Alto Router 包调用函数的问题
- flutter - Flutter 从 List 中获取键值
- ios - 您如何生成一个不随其下方的表格滚动并且在刷新时不反弹的故事板标题?
- json - Flutter newbie - 使用 http 从 JSON 文件中获取数据