2011-09-15 104 views
3

你能告訴我Linq2SQL在哪裏對我的sql服務器執行查詢嗎?我希望在我映射到名爲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()。如果您對您的數據庫運行profiler

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

,你應該看到當你通過代碼執行查詢: 您可以通過打破查詢下來這樣,添加一個斷點證實了這一點。

更多的信息在這裏:LINQ and Deferred Execution

+1

使用Single()時要小心,因爲即使已找到該元素,它也會遍歷整個集合。它可能會影響性能。如果您確定只有一個元素,請使用First()或FirstOrDefault()。 –

+0

@Vince - 查詢只會返回一條記錄。 – Phill

+0

@Phill:是的,但Single()將確保沒有其他元素符合該條件,因此掃描整個集合。如果您有「大量」物品,它可能會影響性能。 –