【问题标题】:Entity Framework Metadata LINQ (Converting from C# to VB.NET)实体框架元数据 LINQ(从 C# 转换为 VB.NET)
【发布时间】:2009-07-26 04:58:54
【问题描述】:

我在 C# 中有一个查询,它可以让我查询实体框架的元数据。我需要将其转换为 VB.NET,但我正在努力将 AS 关键字转换为“cast”元到 System.Data.Metadata.Edm.EntityType。我尝试过 TryCast、CType、Cast 等。

这是 C# 中的查询:

var queryResult = from meta in oc.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace)
                  .Where(m => m.BuiltInTypeKind == System.Data.Metadata.Edm.BuiltInTypeKind.EntityType)
                                  from p in (meta as System.Data.Metadata.Edm.EntityType).Properties
                                  .Where(p => p.DeclaringType.Name == entityClassType.Name
                                  && p.Name == propertyName)
                                  select p;

这是我最接近在 VB.NET 中编译的结果(As 关键字在下划线中表示“)”:

Dim query2 = _
             From meta In entityObjectContext.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace) _
                  .Where(Function(m) m.BuiltInTypeKind = System.Data.Metadata.Edm.BuiltInTypeKind.EntityType) _
                  From p In (meta As System.Data.Metadata.Edm.EntityType).Properties _
                  .Where(Function(p) p.DeclaringType.Name = entity.GetType().Name _
                         And p.Name = propertyName) _
                  Select p

这可要了我的命。我好近啊……

【问题讨论】:

  • 你说你尝试过 CType。 @dahlbyk 的回答对你有用吗?
  • 所以我完全错过了你说你尝试过 CType。试试 OfType()。 :)

标签: linq entity-framework metadata entity


【解决方案1】:

您可以使用 CType 进行类型转换:

...
From p In CType(meta, System.Data.Metadata.Edm.EntityType).Properties _
...

更新:再次查看查询,我建议改用OfType()

From meta In entityObjectContext.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace) _
             .OfType(Of System.Data.Metadata.Edm.EntityType)() _
From p In meta.Properties _
Where p.DeclaringType.Name = entity.GetType().Name _
    And p.Name = propertyName _
Select p

更新 2:另外,看起来 GetItems() 有一个 generic version 我怀疑它只会返回您想要的类型的项目:

From meta In entityObjectContext.MetadataWorkspace.GetItems(Of System.Data.Metadata.Edm.EntityType)(System.Data.Metadata.Edm.DataSpace.CSpace) _
From p In meta.Properties _
Where p.DeclaringType.Name = entity.GetType().Name _
    And p.Name = propertyName _
Select p

【讨论】:

    【解决方案2】:

    如果我在 VB.NET 中编写此查询,我会在没有 lambda 的情况下这样做。我认为它更容易阅读,但你这样做的方式可能会让 C# 开发人员更容易阅读。

    Dim query2 = _
        From meta In entityObjectContext.MetadataWorkspace.GetItems(System.Data.Metadata.Edm.DataSpace.CSpace) _
            Where m.BuiltInTypeKind = System.Data.Metadata.Edm.BuiltInTypeKind.EntityType _
                From p In CType(meta, System.Data.Metadata.Edm.EntityType).Properties _
                    Where p.DeclaringType.Name = entity.GetType().Name _
                         And p.Name = propertyName) _
                Select p
    

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 2023-03-03
      • 2011-06-15
      相关资源
      最近更新 更多