Linq 与实体框架错误 - 无法创建类型的常量值

本文关键字:类型 创建 常量 实体 框架 错误 Linq | 更新日期: 2023-09-27 18:36:41

我收到以下错误:异常详细信息:系统。不支持异常:无法创建类型为"文件组合"的常量值。在此上下文中仅支持基元类型或枚举类型

我正在使用以下代码:

var o1 = new FileCombined (){ ScholarshipID = 3, FileDescription = "smt" };
var o2 = new FileCombined() { ScholarshipID = 10, FileDescription = "smt" };
List <FileCombined> list = new FileCombined[] { o1, o2 }.ToList();
var data = (from scholarship in db.ScholarshipRequests  
            join file in list on scholarship.ScholarshipRequestID equals file.ScholarshipID
            select new { ScholarshipID = scholarship.ScholarshipRequestID, FileDescription = file.FileDescription }).ToList();

如果我更改 linq 表达式的顺序,查询工作正常:

var o1 = new FileCombined (){ ScholarshipID = 3, FileDescription = "smt" };
var o2 = new FileCombined() { ScholarshipID = 10, FileDescription = "smt" };
List <FileCombined> list = new FileCombined[] { o1, o2 }.ToList();
var data = (from file in list
            join scholarship in db.ScholarshipRequests on file.ScholarshipID equals scholarship.ScholarshipRequestID  
            select new FileCombined (){ ScholarshipID = scholarship.ScholarshipRequestID, FileDescription = file.FileDescription }).ToList();

任何人都可以解释或找到解决方案吗?我需要第一个查询才能工作,因为我在连续代码中有更复杂的查询

Linq 与实体框架错误 - 无法创建类型的常量值

为了补充@Maarten的答案,我会说你也可以删除连接并使用Contains,因为在你的情况下你会得到相同的结果(我想list不会变得很大)。然后,您可以在列表中查找FileDescription(我可能会创建字典)。

var list2 = list.Select(x => x.ScholarshipID);
var data = (from scholarship in db.ScholarshipRequests
            where list2.Contains(scholarship.ScholarshipRequestID)
            select new { ScholarshipID = scholarship.ScholarshipRequestID }).ToList();
// do the lookup in "list" and get result

假设list是内存中的变量,并且db.ScholarshipRequests是上下文中的表,这确实是不可能的。不能期望 EF 创建将数据库表与内存中集合联接的查询。

您可以在内存中加载表,

但请注意,这会将整个表加载到内存中,这可能会/将导致性能问题。

像这样(我在db.ScholarshipRequests之后添加了.ToList()):

var data = (from scholarship in db.ScholarshipRequests.ToList()
            join file in list on scholarship.ScholarshipRequestID equals file.ScholarshipID
            select new { ScholarshipID = scholarship.ScholarshipRequestID, FileDescription = file.FileDescription }).ToList();