首页 > 后端开发 > C++ > 如何解决加入内存集合的 LINQ 查询中的'无法创建常量值”错误?

如何解决加入内存集合的 LINQ 查询中的'无法创建常量值”错误?

DDD
发布: 2025-01-17 23:34:09
原创
944 人浏览过

How to Resolve

使用内存数据解决 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中文网其他相关文章!

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