4

2行のコードがあります。1つは

AllItems().Where(c => c.Id== id)
          .Select(d => new Quality(d.QualityType)).ToList();

ともう1つ

AllItems().Where(c => c.Id== id).ToList()
          .Select(d => new Quality(d.QualityType)).ToList();

唯一の違いは、2番目ToList()のステートメントがステートメントの後に呼び出されるWhereことです。2番目のステートメントは問題なく機能します。

最初のステートメントでは、パラメーターを持つコンストラクターの代わりに、デフォルトのパラメーターなしのコンストラクターがヒットします。したがって、リストは作成されますが、リスト内のオブジェクトは、d.QualityTypeではなくデフォルト値で初期化されます。

問題のファイルの完全なソースは、(メソッド:GetBestQualityInHistory)で確認できます。

https://github.com/kayone/NzbDrone/blob/master/NzbDrone.Core/Providers/HistoryProvider.cs

ToList**編集:さらに調査した結果、Lastがsubsonicに置き換えられた場合、これはSubSonicのバグのようOrderByですThe construtor 'Void .ctor(NzbDrone.Core.Repository.Quality.QualityTypes, Boolean)' is not supported

4

2 に答える 2

4

SubSonicがEntityFrameworkと同じように機能する場合、パラメーター付きのコンストラクターを使用することはできません。パラメーターなしのコンストラクターと初期化子を使用する必要があります。これについての私の非常に高レベルの説明は、クエリがそのまま実行されないことです-それはSQLに変換されるため、式ツリーが投影型のどのプロパティに値を入力する必要があるかを知るために、プロパティ初期化子を使用する必要があります。パラメーターでコンストラクターを使用する場合、式ツリーは渡されたパラメーターがどこに属するかを認識しません(コンストラクターの内容をチェックしません)。実行するTolistと、実際のコンストラクター(パラメーターなし)が呼び出され、結果セットがQuantityTypeインスタンスに具体化されます。

于 2011-06-05T19:50:23.320 に答える
0

これは実際には答えではなく、コメントにするつもりでしたが、コードスニペットのためのより多くのスペースが必要でした。

SubSonicコードから判断すると、「コンストラクターがサポートされていません」というエラーが発生する場合、SSは何らかの理由でnew ...()ステートメントをSQLに解析しようとしていると確信しています。問題のあるメソッドはSQLフォーマッターの一部であり、DateTimeのみを処理するように見えます。

    protected override NewExpression VisitNew(NewExpression nex)
    {
        if (nex.Constructor.DeclaringType == typeof(DateTime))
        {
            // ...omitted for brevity...
        }
        throw new NotSupportedException(string.Format("The construtor '{0}' is not supported", nex.Constructor));
    }

あなたが次のようなことをした場合、それは通常ヒットすると思います:

someData .Where(data => data.CreatedDate <= new DateTime(2011、12、01)).Select(data => data)

次に、それnewDateTimeはSQLに変換されます。したがって、Linqを変更してその例外を取得しても、それが起こっていると思います。これは、.OrderBy() 後にを追加すると、.Select()AllItems()が返すもののIQueryableでOrderByを呼び出さなくなり、代わりに.Select()によって返されるもので並べ替えようとするためだと思います。新しい品質オブジェクトであるため、SSはおそらくそれらすべてをSQLに変換しようとします。

あなたがそれを逆にした場合、それが正しく機能するかどうか疑問に思いますか?

AllItems().Where(c => c.Id== id)
      .OrderBy(d => d.QualityType)
      .Select(d => new Quality(d.QualityType));
于 2011-06-06T18:11:30.650 に答える