【问题标题】:Any way to work around linq2Entities exception - Unable to create a constant value of type 'System.Object'.解决 linq2Entities 异常的任何方法 - 无法创建类型为“System.Object”的常量值。
【发布时间】:2012-09-07 01:37:47
【问题描述】:

场景是

void someFunc(object obj1 )
{

  using ( var ctx = getContext() )
  {
    var list = ctx.MyTable.Where ( .... ).OrderBy( ... ).Select (
      x => new PocoObject
      {
          string = x.String,
          ....
          // Command = new MyCommand { prop1 = x } // working code 
          Command = new MyCommand { prop1 = x, objProp = obj1 } // problem line
      }
      ).ToList();

      //list.ForEach( x => x.Command.objProp = obj1 ); working code
  }

}

例外是

无法创建“System.Object”类型的常量值。此上下文仅支持原始类型或枚举类型

用标记为工作代码的代码更改问题行即可解决问题

有什么方法可以调整它以使其更简单,即最后没有 ForEach 吗?

【问题讨论】:

  • objProp的类型是什么?
  • 在表达式中使用“Object”有点冒险,因为我们不知道你得到的“Object”的实际类型。基本上,我认为你会在表达之外投射

标签: c# .net visual-studio-2010 linq


【解决方案1】:

您可以添加一个 AsEnumerable() 调用,这将阻止转换为 SQL。这将解决问题,因为 obj1 不能被转换为 SQL,因为它不是原始类型。

void someFunc(object obj1) {
    using (var ctx = getContext()) {
        var list = ctx.MyTable
            .Where ( .... )
            .OrderBy( ... )
            .AsEnumerable() // <-- Everything below is not translated to SQL.
            .Select(x => new PocoObject {
                string = x.String,
                ....
                Command = new MyCommand { prop1 = x, objProp = obj1 }
            })
            .ToList();
    }
}

【讨论】:

    【解决方案2】:

    正如错误所说...“在此上下文中仅支持原始类型或枚举类型”。

    匿名对象的初始化将在 SQL 中完成,基本上如下所示:

    DECLARE @obj1 (TYPE?) = ...;
    SELECT
        ...
        objProp = @obj1
    ...
    

    因此,除非您可以将该值存储为 SQL 变量,否则这是行不通的。

    我不认为有任何解决方法,除了琐碎的和你已经尝试过的:

    • 使用类型变量,类型为原始类型或枚举类型
    • 在查询执行后添加值

    我想在某些情况下,您可以考虑将值序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      相关资源
      最近更新 更多