我有这样的功能
public List<Code> GetCodes()
{
return _db.Codes.Select(p => p).ToList();
}
此表中有160,000条记录,其中包含2列。
然后我也按如下方式循环播放..
List<Code> CodeLastDigits = CodeDataProvider.GetCodes();
然后循环播放
foreach (var postCodeLastDigit in PostCodeLastDigits)
我只是想了解一次调用数据库检索这些记录的次数,并希望确保它只发生一次。
答案 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);
}