LINQ 查询错误:“无法创建类型为 API.Models.PersonProtocol 的常量值。此上下文中仅支持原始类型或枚举类型”
本文将解决一个 LINQ 查询中出现的错误,该错误源于尝试在 SELECT 子句中创建类型为 API.Models.PersonProtocol 的常量值。此上下文中仅允许原始类型或枚举类型作为常量。
问题出在以下代码行:
<code class="language-csharp">personProtocol = (ICollection<personprotocol>) ppCombined .Where(a => a.personId == x.personId) .Select( b => new PersonProtocol() { personProtocolId = b.personProtocolId, activateDt = b.activateDt, personId = b.personId })</code>
此处,ppCombined
是一个内存中的 PersonProtocolType
对象集合。它无法直接与从数据库检索到的数据进行连接。
解决方案
为了解决此错误,需要将 ppCombined
的过滤和映射操作移到 SELECT 子句之外。以下是修改后的代码:
<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>
在这个修改后的查询中,ppCombined
集合首先在内存中进行过滤和映射,得到所需的 PersonProtocol
对象。然后,结果被赋值给 PersonDTO
对象的 personProtocol
属性。 通过将对 ppCombined
的处理移至 AsEnumerable()
之后,避免了在数据库查询中使用内存集合。 AsEnumerable()
将数据库查询结果转换为内存集合,之后的操作都在内存中进行,从而解决了原始错误。
以上是为什么我的 LINQ 查询失败并显示'无法创建类型的常量值...”?的详细内容。更多信息请关注PHP中文网其他相关文章!