您可以在带有实体框架核心的 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
从它出现的地方。 stateSchoolDirector
、stateSchoolDirector
、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 查询
FakeItEasy DbSet / IQueryable<T> - 实体框架 6