使用内存数据解决 LINQ 查询中的“持续创建失败”
挑战:
LINQ 查询失败,生成错误“无法创建 API.Models.PersonProtocol 类型的常量值。此上下文中仅支持原始类型或枚举类型。”这是在数据库记录和内存集合(名为 ppCombined
)之间的联接操作期间发生的。
理解错误:
出现此错误的原因是 LINQ to Entities(或类似的 ORM)无法直接将涉及内存中集合的联接转换为 SQL。 两个数据集都需要驻留在数据库中,以便连接能够在数据库中有效执行。
解决方案:两阶段方法
解决方案涉及将数据库查询与内存处理分开。 首先,从数据库中检索必要的数据,然后在单独的内存操作中与内存集合执行连接:
<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 // anonymous object { personId = p.personId, addressId = p.addressId, favoriteId = f.favoriteId, }) .AsEnumerable() // Crucial: This line switches to in-memory processing .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()
方法是关键。它强制执行数据库查询,返回内存中的集合。 然后,后续的 Select
语句会处理此内存中数据,并在应用程序的内存中将其与 ppCombined
有效地连接起来。 这避免了尝试直接在数据库上下文中执行连接的限制。
以上是如何解决加入内存集合的 LINQ 查询中的'无法创建常量值”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!