【发布时间】: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<string, object>)。一些调查表明these types are being generated 基于静态Model.DefaultPropertyBagType(即Dictionary<string, object>)。但尽管盯着 EFCore 代码库,我无法辨别如何正确查询这种默认属性包类型。
如果相关的话,我正在使用 MySQL 作为我的数据库。
【问题讨论】:
标签: .net-core linq-to-sql entity-framework-core linq-to-entities