查询过程中出现异常:“无法创建类型 API.Models.PersonProtocol 的常量值。此上下文中仅支持基本类型或枚举类型。”
查询尝试在另一个 JOIN 的 SELECT 子句中使用 LINQ JOIN。但是,这种方法会失败,因为 ppCombined(PersonProtocolType 的 IEnumerable 对象)不能用作常量值类型。
具体问题在于 ppCombined 集合表示内存中的数据,而查询针对数据库中的数据执行。无法组合这两组数据。
为了解决这个问题,请在使用中间结果从数据库检索其他属性后,从内存中的 ppCombined 中提取过滤后的项目。
替换原始查询,可以使用以下修改后的方法:
<code class="language-csharp">var persons = db.Favorites .Where(f => f.userId == userId) .Join(db.Person, f => f.personId, p => p.personId, (f, p) => new // 匿名对象 { personId = p.personId, addressId = p.addressId, favoriteId = f.favoriteId, }) .AsEnumerable() // 数据库查询在此处结束,其余部分是内存中的查询 .Select(x => new PersonDTO { personId = x.personId, addressId = x.addressId, favoriteId = x.favoriteId, personProtocol = ppCombined .Where(p => p.personId == x.personId) .Select(p => new PersonProtocol { personProtocolId = p.personProtocolId, activateDt = p.activateDt, personId = p.personId }) .ToList() });</code>
AsEnumerable()
方法确保数据库查询在继续进行内存中查询之前完成。这样就可以在检索数据库数据后,在内存中过滤和投影 ppCombined 集合。
以上是为什么在 SELECT 子句中使用非基本类型连接时,我的 LINQ 查询会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!