C# LINQtoSQL什么时候运行查询?

C# LINQtoSQL什么时候运行查询?,c#,linq-to-sql,C#,Linq To Sql,您能告诉我Linq2SQL在哪里对我的sql server执行查询吗?我希望它发生在我映射到名为Car的域对象之后 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 CarRep

您能告诉我Linq2SQL在哪里对我的sql server执行查询吗?我希望它发生在我映射到名为
Car
的域对象之后

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;
    }        
}
公车
{
公共Guid CarId{get;set;}
公共字符串Make{get;set;}
公共字符串模型{get;set;}
公共int马力{get;set;}
}
公共级进位
{
私有只读MyDataContext\u dc;
专用只读功能映射车=
c=>新车
{
CarId=c.CarId,
马力=c.马力,
Make=c.Make,
模型=c.模型,
};
公共转存(MyDataContext dc)
{
_dc=dc;
}
公共汽车GetCar(Guid carId)
{
var car=\u dc.GetTable()
.选择(_mappedCar)
.单个(c=>c.CarId==CarId);
返回车;
}        
}

没错。SQL查询的执行延迟到调用
Single()
为止。 您可以通过如下方式分解查询并添加断点来确认这一点:

var carQuery = _dc.GetTable<DbCar>().Select(_mappedCar)  // <= breakpoint
var car = carQuery.Single(c => c.CarId == carId);
var carQuery=\u dc.GetTable().Select(\u mappedCar)//c.CarId==CarId);
如果对数据库运行查询,则在遍历代码时,应该可以看到查询的执行位置


更多信息请点击此处:

这真的有效吗?如果是这样,我对Linq to SQL能够解析
\u mappedCar
函数并将
c=>c.CarId==CarId
谓词映射回db世界印象深刻……使用Single()时要小心,因为即使找到了元素,它也会遍历整个集合。这可能会影响性能。如果确定只有一个元素,请使用First()或FirstOrDefault()。@Vince-查询将只返回一条记录。@Phill:是,但single()将确保没有其他元素与该条件匹配,因此,扫描整个集合。如果您有“很多”项,可能会影响性能。@文斯-没有性能影响,没有包含多条记录的集合。这不是内存中的集合,它正在创建一个SQL查询,该查询将返回一个结果集和一条记录。@Vince-OP是按标识列选择的,选择top 1不会提高性能,如果该列没有索引,或者您选择的是非标识列,那么您只能获得性能优势。如果没有关于身份的索引,那么显然有更大的问题需要担心。