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

SQL への変換を防ぐ AsEnumerable() 呼び出しを追加できます。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 に答える