您可以在带有实体框架核心的 Iqueryable 中使用带有 let 语句的字典吗?

Posted

技术标签:

【中文标题】您可以在带有实体框架核心的 Iqueryable 中使用带有 let 语句的字典吗?【英文标题】:Can you use a dictionary with a let statement in Iqueryable with Entity framework core? 【发布时间】:2021-11-06 12:32:08 【问题描述】:

所以我要做的是编写代码,根据我必须向区议会提交许可证的数据来选择合适的人员。此代码与我的实际代码库混淆,因此请耐心等待学生/班级示例。

逻辑应该说,如果没有老师在场,或者老师没有执照,则使用州立学校董事执照。如果我们找不到,请使用国家/地区。

当我从查询中排除状态主管时,回退工作正常,它运行没有问题。但是,当我尝试包含此内容时,它会引发“System.InvalidOperationException”。我已验证所有学生都有当前地址,并且字典中存在适当的状态。

看起来我当前在 iqueryable 中使用字典的语法无效,并且 EF 不知道如何使用字典!


 var qry = from student in FilteredContext // type is IQueryable<Student>
  let studentsAddress = student.Addresses.FirstOrDefault(x=>x.IsCurrent)
  
  let instructor = lastClass == null ? : lastClass.Instructor
  let stateSchoolDirector = _personnelContext.Context.FirstOrDefault(x=>x.ID == SchoolDirectors.ByState[currentAddress.State])
  let nationalSchoolDirector = _personnelContext.Context.FirstOrDefault(x => x.ID == SchoolDirectors.NationalSchoolDirector)
  
  let personnelForLicense = instructor ?? stateSchoolDirector ?? national
  
  select personnelForLicense.License;
  
  var results = qry.ToList();
  

所以我的问题是,有没有办法在 iqueryable 中表示字典或类似的东西?如果没有,是否有任何合理的解决方法?我完全被困在这里,尽管在 *** 或谷歌搜索结果中无法轻易找到类似的东西。我能找到的最接近的建议是告诉我转换为 .AsEnumerable() ,但我看不到它如何与我的 let 语句一起使用

【问题讨论】:

这里没有字典。是的,查询可以重写为可翻译的,但它太模糊了,我无法理解所有关系。 lastClass 从它出现的地方。 stateSchoolDirectorstateSchoolDirector national 也不是。可见分析。 澄清一下,字典是 Dictionary ByState[currentAddress.State]。很抱歉造成混淆,但它是一个 key->string value->guid 的字典,其中 guid 是人事记录上的主键 我在我的代码中发现了一个错误,除了我发布的关于字典查找的内容。由于 Instructor 是一条记录,因此对象实体框架无法将 null 与实例合并。它只能用类似 SQL 的对象进行翻译。我正在更新我的代码以忽略 null coalese,并直接为人员调用 stateSchoolDirector。但是,由于字典查找,它仍然与 InvalidOperation 出错 哈我不能!!!好吧,如果我能改变它,它会读到这个……让personalForLicense = /*instructor ??*/ stateSchoolDirector /*?? national*/ 这段代码显然不正确,但它与我试图解决的问题隔离开来。我可以通过使用三元空值检查来绕过空值合并,尽管它更难读 【参考方案1】:

只是为了完整循环,我能想到的唯一选择是将字典转换为上下文中的实际 SQL 表/实体

【讨论】:

以上是关于您可以在带有实体框架核心的 Iqueryable 中使用带有 let 语句的字典吗?的主要内容,如果未能解决你的问题,请参考以下文章

在循环中使用 IQueryable 的实体框架 WHERE OR 查询

实体框架代码优先 IQueryable

试图模拟 IQueryable 实体框架查询

FakeItEasy DbSet / IQueryable<T> - 实体框架 6

实体框架,如何将 IQueryable 与多个 where 转换为 SQL 一起使用?

Asp.net 核心 - 实体框架核心 - 将附加数据添加到视图对象,同时保持它是可查询的