2011-09-15 8 views
3

Linq2SQLがSQL Serverに対してクエリを実行する場所を教えてください。私はCarというドメインオブジェクトにマップした後に起こることを望んでいます。Linq-to-SQLはいつクエリを実行しますか?

public class Car 
{ 
    public Guid CarId { get; set; } 
    public string Make { get; set; } 
    public string Model { get; set; } 
    public int HorsePower { get; set; } 
} 

public class CarRepository 
{ 
    private readonly MyDataContext _dc; 

    private readonly Func<DbCar, Car> _mappedCar = 
     c => new Car 
       { 
        CarId = c.CarId, 
        HorsePower = c.HorsePower, 
        Make = c.Make, 
        Model = c.Model, 
       }; 

    public CarRepository(MyDataContext dc) 
    { 
     _dc = dc; 
    } 

    public Car GetCar(Guid carId) 
    { 
     var car = _dc.GetTable<DbCar>() 
      .Select(_mappedCar) 
      .Single(c => c.CarId == carId);     

     return car; 
    }   
} 
+0

実際には機能しますか?もしそうなら、私はLinq-to-SQLがあなたの '' _mappedCar''関数を解決し、 '' c => c.CarId == carId''述語をdbワールドに戻すことができると非常に感心しています... –

+0

ええ、それ働く –

答えて

7

これは正しいです。 SQLクエリの実行は、Single()が呼び出されるまで延期されます。 あなたはこのようなクエリを分解し、ブレークポイントを追加することでこれを確認することができます

var carQuery = _dc.GetTable<DbCar>().Select(_mappedCar) // <= breakpoint 
var car = carQuery.Single(c => c.CarId == carId); 

あなたのデータベースに対してprofilerを実行する場合は、コードをステップとして、クエリが実行された場合、あなたが表示されるはずです。

詳細情報はこちらLINQ and Deferred Execution

+1

要素が見つかったとしても、コレクション全体を反復処理するので、Single()を使用するときは注意が必要です。パフォーマンスに影響を与える可能性があります。要素が1つしかない場合は、First()またはFirstOrDefault()を使用します。 –

+0

@Vince - クエリは単一のレコードのみを返します。 – Phill

+0

@Phill:はいですが、Single()はその基準に一致する他の要素がないことを確認し、コレクション全体をスキャンします。アイテムの数が多い場合、パフォーマンスに影響を与える可能性があります。 –

関連する問題