首页 > 后端开发 > C++ > 为什么使用内存中集合时我的 LINQ JOIN 失败?

为什么使用内存中集合时我的 LINQ JOIN 失败?

Barbara Streisand
发布: 2025-01-17 23:41:12
原创
812 人浏览过

Why Does My LINQ JOIN Fail When Using an In-Memory Collection?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板