0

场景是

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 吗?

4

2 回答 2

2

您可以添加一个 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();
    }
}
于 2012-09-07T05:49:14.160 回答
0

正如错误所说......“在这种情况下仅支持原始类型或枚举类型”。

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

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

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

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

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

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

于 2012-09-07T01:48:55.730 回答