1

次のような Linq クエリがあります。

var dataByWheels = this.Db.Cars.Cast<IVehicle>().Where(v => (v.NumWheels == 4));

IVehicleこの場合は、クラスがNumWheelsプロパティを持つ必要があることを定義するインターフェイスです。クラスは次のCarsようになります。

[Table]
public class Car : IVehicle
{
     [Column]
     public double Weight { get; set; }

     ...

     public int NumWheel 
     {
         get { return 4; }
     }
}

したがって、この場合、NumWheelsプロパティはデータベースに保存されませんが、キャストが完了していれば問題ありません。ただし、例外が発生します。

The member 'MyProject.IVehicle.NumWheels' has no supported translation to SQL

これは、キャストを実行していないことを意味します。ToList()動作後にチェーンにa を挿入するCastと、クエリが時期尚早に解決され、テーブル全体の巨大なリストが作成され、電話で作業しているので避けたいと思います。

私は何を間違っていますか?

(これを簡単にするために名前とクエリを変更したことに注意してください)

4

2 に答える 2

3

これはWhere、LINQ to SQL クラスに対してステートメントを発行すると、LINQ to SQL エンジンは、データベースに対して直接 WHERE ステートメントを実行していると想定し、そのステートメントを未加工の T-SQL にマップしようとするためNumWheelsです。データベース列ではありません。

これを克服するためToListに、最初にそれを行うことができますが、行う場合はパフォーマンスへの影響に注意してください。このコードは、テーブル全体を循環し、Carsメモリ内でフィルタリングを行います。ただし、あなたの目標を達成する別の方法は考えられません。

var dataByWheels = this.Db.Cars.ToList().Where(v => (v.NumWheels == 4));
于 2013-04-25T19:17:47.877 に答える
1

問題は LINQ ではなく、使用コンテキストです。この特定の LINQ クエリは Queryable で使用されており、キャストは強制的に DB に移動し、その時点ですべての結果をプルバックします。その後、列挙型でキャストを実行して続行できますが、この場合、探しているものではない可能性があります。

このエラーは、SQL にマップできず、SQL サーバーで実行できない式を記述したことを示しているだけです。これは EF のものであり、LINQ のものではありません。

于 2013-04-25T19:14:14.863 に答える