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
相关产品推荐
相关产品推荐

