LINQ 连接和内存集合故障排除
尝试直接合并内存中集合(如本例中的 ppCombined
)时,经常会出现错误“无法创建类型的常量值...在此上下文中仅支持原始类型或枚举类型”转换为数据库 LINQ 查询。 这是因为数据库查询仅对数据库驻留数据进行操作; 不直接支持与内存数据连接。
问题通常出现在 Select
语句的 Join
子句中。 尝试创建 PersonDTO
对象(包括从内存集合填充的属性)会导致冲突。
LINQ JOIN 失败的根本原因
该错误是由于尝试在数据库查询的 Where
语句内的 ppCombined
集合 上执行过滤操作( 子句)而引起的。 数据库引擎无法将此内存中操作转换为其自身的等效操作。Select
解决方案:将数据库和内存操作分开
解决方案是将数据库查询与内存处理分开。 这涉及首先执行数据库查询,然后对生成的内存数据集执行过滤和数据操作。 方法是这里的关键。 它强制执行数据库查询,将结果作为 AsEnumerable()
对象返回,允许后续操作完全在内存中进行。IEnumerable
<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() // Database query completes here .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 JOIN 失败?的详细内容。更多信息请关注PHP中文网其他相关文章!