我有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);
}
答案 0 :(得分:8)
我认为你在.NET中的数据操作中缺少一个重要的概念
延迟和立即获取
需要强调的一点是,默认情况下,LINQ to SQL会从中检索数据 数据库仅在您请求它时,而不是在您定义LINQ to SQL查询或创建时 表集合。这称为延迟提取。
当foreach循环启动时,LINQ to SQL创建并运行派生的SQL SELECT语句 从LINQ to SQL查询创建ADO.NET DataReader对象。每次迭代 foreach循环执行必要的GetXXX方法来获取该行的数据。后 LINAC to SQL关闭了最后一行,并由foreach循环处理 数据库连接。
延迟提取可确保仅检索应用程序实际使用的数据 数据库。但是,如果要访问在远程SQL实例上运行的数据库 服务器逐行获取数据并不能充分利用网络带宽。在这 方案,您可以通过强制立即获取和缓存单个网络请求中的所有数据 评估LINQ to SQL查询。您可以通过调用ToList或ToArray来完成此操作 扩展方法,在定义LINQ to SQL时将数据提取到列表或数组中 查询,像这样:
var productsQuery = from p in products.ToList()
select p;
答案 1 :(得分:3)
尝试第1条陈述(注意.ToList()
陈述)
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 }).ToList();
答案 2 :(得分:1)
您可以执行类似.ToList()的操作,它应该强制执行。