You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linq to Entity Framework报错:无法创建指定类型常量值,求解决

问题原因

EF在解析LINQ查询时,没法把内存里复杂对象集合的属性投影(比如你写的List.Select(s => s.Study))转换成SQL能识别的常量集合。你直接对内存中的List做Select后调用Contains,EF转不了这个逻辑成SQL,所以抛了异常。

修复方案

先从你的List里把Study和System单独提取成基元类型的集合,再用这些集合做Contains筛选,EF就能正常转成SQL的IN查询了。

修改后的代码:

// 先提取基元类型集合
var studyValues = List.Select(s => s.Study).ToList();
var systemValues = List.Select(s => s.System).ToList();

var DbQry = (from data in Db.ACCESS
             where data.Active == true
                   && studyValues.Contains(data.Study)
                   && systemValues.Contains(data.System)
             select data).ToList();
补充:如果要匹配Study和System的组合

要是你需要的是数据的Study和System同时对应List里同一个元素的两个属性(不是分别匹配两个集合),上面的写法就不对了,得这么改:

// 把List里的组合转成值元组集合(EF Core 3.0+支持)
var studySystemPairs = List.Select(s => (s.Study, s.System)).ToList();

var DbQry = Db.ACCESS
    .Where(data => data.Active == true
                   && studySystemPairs.Any(p => p.Study == data.Study && p.System == data.System))
    .ToList();

旧版本EF可能不支持值元组,换成匿名类型就行:List.Select(s => new { s.Study, s.System }).ToList()

内容的提问来源于stack exchange,提问作者Adam Mohammed Dabdoub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:15:28