2011-09-15 73 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()将确保没有其他元素符合该条件,因此扫描整个集合。如果您有“大量”物品,它可能会影响性能。 –