【问题标题】:Linq With Entity Framework Error - Unable to create a constant value of type带有实体框架错误的 Linq - 无法创建类型的常量值
【发布时间】:2013-10-23 08:08:33
【问题描述】:

我收到以下错误: 异常详细信息:System.NotSupportedException:无法创建“FileCombined”类型的常量值。此上下文仅支持原始类型或枚举类型

我正在使用以下代码:

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();

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

【问题讨论】:

  • ScholarshipRequests 是否附加到数据库?如果它在第一个代码示例中,LINQ 将尝试在不知道您的 List 对象的数据库上运行查询。
  • 感谢您的解释。

标签: c# asp.net entity-framework linq-to-entities


【解决方案1】:

要添加到@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

【讨论】:

  • 谢谢,我试试
【解决方案2】:

假设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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多