【问题标题】:Entity Framework getting Exceptions:System.NotSupportedException: Unable to create a constant value of type ''实体框架出现异常:System.NotSupportedException:无法创建类型为“”的常量值
【发布时间】:2013-10-17 21:13:49
【问题描述】:

实体框架出现异常:System.NotSupportedException:无法创建“”类型的常量值。此上下文仅支持原始类型或枚举类型。

using (var ctx = ContextManager.GetContext())
{
    var executions = from e in ctx.Executions
                     join o in ctx.Outputs on e.ExecutionID equals o.ExecutionID into outputs
                     where e.Status == (int)ExecutionStatus.Pending &&
                                        outputs.All(o => o.Status != (int)OutputStatus.InProcess && o.Status != (int)OutputStatus.New)
                     select e;
}

我想要的只是没有新的或正在进行的输出的执行。 我怎样才能以不同的方式编写它以便它可以工作?

【问题讨论】:

  • 您是否尝试过不强制转换枚举,我可能是错的,但我认为 EF 会为您处理将它们转换为整数。
  • 感谢您的快速回复。但不幸的是,我试过了,它不起作用。
  • 创建一个执行连接的视图? EF 可能无法很好地处理“输出”,因为它不在模型中。
  • 我不想这么快创建视图。它应该是一个简单的 linq 语句。我想要的只是没有新的或正在进行的输出的执行
  • 什么版本的实体框架? msdn.microsoft.com/en-us/data/hh859576.aspx

标签: c# entity-framework


【解决方案1】:

将枚举投射到查询之外并仅引用 int 变量。 SQL 生成器的表达式很可能试图将这些转换解释为要转换为 SQL 的东西,而不是要在内存中评估的东西。

例如:

int p = (int)ExecutionStatus.Pending;
int i = (int)OutputStatus.InProcess;
int n = (int)OutputStatus.New;

using (var ctx = ContextManager.GetContext())
{
        var executions = from e in ctx.Executions
                         join o in ctx.Outputs on e.ExecutionID equals o.ExecutionID into outputs
                         where e.Status == p &&
                                            outputs.All(o => o.Status != i && o.Status != n)
                         select e;
}

编辑: 尝试改变你复杂的输出。所有(条件正常

where e.Status == p && o => o.Status != i && o.Status != n

【讨论】:

  • @BenRobinson 已经建议了。同样的例外......这绝对不是问题。
  • @BenRobinson 建议完全移除演员表。我建议把它们放在外面。这有点不同。无论如何,如果这不起作用,那么您的问题不是来自演员阵容,而是来自查询中的其他内容。如果无法访问您的实体定义,我无法提供更多想法
  • 无论如何,弹出的另一个奇怪的事情是你的输出。所有条件。也许我需要一些咖啡,但你能举个例子说明所需的 SQL 是什么?
  • 我需要这样的东西:'var exes = ctx.Executions.GroupJoin(ctx.Outputs, execution => execution.ExecutionID, output => output.ExecutionID, (execution, outputs) => new { 执行,存在 = outputs.Any(o => o.Status == (int)OutputStatus.InProcess || o.Status == (int)OutputStatus.New) }).Where(item => !item.exists) .Select(item => item.execution);'
  • 即使它有效,如果你一开始不弄清楚为什么第一个错误,你将一无所获。
猜你喜欢
  • 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
相关资源
最近更新 更多