Tom*_*mas 3 .net c# linq linq-to-sql
我有Linq查询,并希望立即执行它,然后操纵数据.现在在下面的代码中,当执行第二(2)Linq查询时,执行第一个(1)Linq查询.我想首先执行first(1)查询,怎么做?
// 1
var statistic = DataAccess.Instance.Statistics
.Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId)
.Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day });
values = new int[interval];
labels = new string[interval];
for (var i = 0; i < labels.Length; i++)
{
// 2
var recordsCount = statistic.Count(p => p.Year == dayStep.Year && p.Month == dayStep.Month && p.Day == dayStep.Day);
}
Run Code Online (Sandbox Code Playgroud)
我认为你在.NET中的数据操作中缺少一个重要的概念
延期和立即获取
需要强调的一点是,默认情况下,LINQ to SQL仅在您请求时才从数据库中检索数据,而不是在定义LINQ to SQL查询或创建Table集合时检索数据.这称为延迟提取.
当foreach循环启动时,LINQ to SQL创建并运行从LINQ to SQL查询派生的SQL SELECT语句,以创建ADO.NET DataReader对象.foreach循环的每次迭代都会执行必要的GetXXX方法来获取该行的数据.在foreach循环提取并处理完最后一行之后,LINQ to SQL将关闭数据库连接.
延迟提取可确保仅从数据库中检索应用程序实际使用的数据.但是,如果要访问在SQL Server的远程实例上运行的数据库,则逐行提取数据并不能充分利用网络带宽.在这种情况下,您可以通过强制立即评估LINQ to SQL查询来获取和缓存单个网络请求中的所有数据.您可以通过调用ToList或ToArray扩展方法来执行此操作,这些方法在定义LINQ to SQL查询时将数据提取到列表或数组中,如下所示:
var productsQuery = from p in products.ToList()
select p;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2883 次 |
| 最近记录: |