首页 > 后端开发 > C++ > 为什么在 SELECT 子句中使用非基本类型连接时,我的 LINQ 查询会失败?

为什么在 SELECT 子句中使用非基本类型连接时,我的 LINQ 查询会失败?

Mary-Kate Olsen
发布: 2025-01-17 23:26:09
原创
262 人浏览过

Why Does My LINQ Query Fail When Joining with a Non-Primitive Type in the SELECT Clause?

无法为非基本类型或枚举类型创建常量值

问题描述

查询过程中出现异常:“无法创建类型 API.Models.PersonProtocol 的常量值。此上下文中仅支持基本类型或枚举类型。”

根本原因

查询尝试在另一个 JOIN 的 SELECT 子句中使用 LINQ JOIN。但是,这种方法会失败,因为 ppCombined(PersonProtocolType 的 IEnumerable 对象)不能用作常量值类型。

具体问题在于 ppCombined 集合表示内存中的数据,而查询针对数据库中的数据执行。无法组合这两组数据。

解决方案

为了解决这个问题,请在使用中间结果从数据库检索其他属性后,从内存中的 ppCombined 中提取过滤后的项目。

修改后的查询

替换原始查询,可以使用以下修改后的方法:

<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>
登录后复制

AsEnumerable() 方法确保数据库查询在继续进行内存中查询之前完成。这样就可以在检索数据库数据后,在内存中过滤和投影 ppCombined 集合。

以上是为什么在 SELECT 子句中使用非基本类型连接时,我的 LINQ 查询会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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