Linq to SQL并使用ToList,进行了多少次DB调用?

时间:2013-12-08 19:03:51

标签: c# linq-to-sql

我有这样的功能

    public List<Code> GetCodes()
    {
        return _db.Codes.Select(p => p).ToList();
    }

此表中有160,000条记录,其中包含2列。

然后我也按如下方式循环播放..

List<Code> CodeLastDigits = CodeDataProvider.GetCodes();

然后循环播放

 foreach (var postCodeLastDigit in PostCodeLastDigits)

我只是想了解一次调用数据库检索这些记录的次数,并希望确保它只发生一次。

3 个答案:

答案 0 :(得分:3)

Linq将延迟对数据库的调用,直到你给它一个理由去。

在您的情况下,您使用ToList()方法提供了理由。

拨打ToList()后,您将拥有内存中的所有项目,并且不会再次访问数据库。

您没有提到您正在使用的数据库平台,但如果它是SQL Server,您可以使用SQL Server探查器来查看对数据库的查询。这是查看linq到SQL运行了多少调用和sql的好方法。正如@acfrancis在下面所说,LinqPad也可以这样做。

对于SQL Server,这是一个关于creating a trace

的好教程

答案 1 :(得分:1)

当你致电ToList()时,它会打到数据库。在这种情况下,看起来您只需要访问数据库一次就可以填充CodeLastDigits。只要你没有在你的foreach中再次访问数据库,你应该是好的。

只要您拥有完整版的SQl Server,就可以在浏览代码时运行Sql Server Profiler,看看数据库上发生了什么。

答案 2 :(得分:1)

可能一次。但更完整的答案取决于它,你应该熟悉这样一种情况,即使像这样的简单访问模式也可能导致许多次往返数据库。

名为codes的表格不太可能包含任何复杂类型,但如果确实存在,则需要注意。根据您访问code对象属性的方式,如果未正确使用LoadWith,则可能会对数据库产生额外的命中。

考虑一个示例,其中有一个Code对象,它包含类结构中的CodeType对象(也映射到表),如下所示:

class Code {
   CodeType type;
}

如果不使用Code对象加载CodeType对象,如果在循环内引用CodeType,Linq to SQL将在循环的每次迭代时联系数据库,因为它只在需要时延迟加载对象。注意这一点,并对LoadWith&lt;&gt;做一些研究。方法和它的使用让你感到舒服,你没有遇到这种情况。

foreach (x in PostCodeDigits) {
    Print(x.type);
}