【问题标题】:How to query a property bag entity type in EFCore5?如何在 EF Core 5 中查询属性包实体类型?
【发布时间】:2020-10-16 18:06:39
【问题描述】:

在 EFCore5 中,隐式表保存为 Dictionary<TKey, object> 集,称为 Property Bag Entity Types。但是,我无法弄清楚如何使用为 MySQL 编译此类属性包实体类型的 Where() 子句创建 LINQ 查询。

例如,在给定ISkipNavigation 的情况下,此代码成功检索到对中间表(由EFcore5 的隐式多对多功能生成)的IQueryable 引用:

ISkipNavigation nav = // some many-to-many relationship

IQueryable<Dictionary<string, object>> intermediateTable = 
  context.Set<Dictionary<string, object>>(nav.JoinEntityType.Name);

并且这段代码成功检索了中间表中的所有条目:

List<Dictionary<string, object>> joins = await intermediateTable.ToListAsync();

在生成的List 中,每个Dictionary 只有一个键/值(代表行)。

但是,我无法弄清楚如何将 .Where() 子句添加到将编译的 LINQ 查询中:

joinTable.Where(d => d.Keys.First() == "foo").ToList();
joinTable.Where(d => d.Keys.Any(k => k == "foo")).ToList();

错误是:

实体类型“MachinePartMachineProfile (Dictionary)”上的成员“键”的翻译失败。这通常发生在指定成员未映射时。以可翻译的形式重写查询,或通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用显式切换到客户端评估

出于性能原因,我不希望进行客户端解析(连接表会很大)。

我注意到错误报告的类型是MachinePartMachineProfile (Dictionary&lt;string, object&gt;)。一些调查表明these types are being generated 基于静态Model.DefaultPropertyBagType(即Dictionary&lt;string, object&gt;)。但尽管盯着 EFCore 代码库,我无法辨别如何正确查询这种默认属性包类型。

如果相关的话,我正在使用 MySQL 作为我的数据库。

【问题讨论】:

    标签: .net-core linq-to-sql entity-framework-core linq-to-entities


    【解决方案1】:

    您可以根据列名直接索引字典。

    工作示例是:

    joinTable.Where(d => d[columnName] == "foo").ToList();
    

    为了完整起见,如果您有一个ISkipNavigation 实例,您可以按如下方式推断这些键:

    string foreignKey = nav.ForeignKey.Properties.First().GetColumnBaseName();
    string localKey = nav.Inverse.ForeignKey.Properties.First().GetColumnBaseName();
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多