2011-12-28 59 views
3

我有Linq查询并希望立即执行它,然后处理数据。现在在下面的代码中,执行第二个(2)Linq查询时,将执行第一个(1)Linq查询。我想先执行第一个(1)查询,该怎么做?Linq to SQL立即执行查询

// 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); 
} 

回答

8

我认为你缺少数据操作的一个重要概念,在.NET

递延和直接载入

强调的重要一点是,默认情况下,LINQ to SQL的检索来自数据 数据库仅在您请求时才提供,而不在您定义LINQ to SQL查询时创建,或者创建 表集合。这被称为延迟提取。

当foreach循环启动时,LINQ to SQL创建并运行从LINQ to SQL查询派生的SQL SELECT语句 以创建ADO.NET DataReader对象。 foreach循环的每次迭代执行必要的GetXXX方法来获取该行的数据。在 之后,最后一行已被foreach循环取回并处理完毕,LINQ to SQL关闭了数据库连接 。

延迟提取确保只有应用程序实际使用的数据从 数据库中检索。但是,如果您正在访问运行在SQL 服务器的远程实例上的数据库,则逐行提取数据不会充分利用网络带宽。在此 方案中,您可以通过强制立即对LINQ to SQL查询执行 评估来获取并缓存单个网络请求中的所有数据。

var productsQuery = from p in products.ToList() 
select p; 
+0

我不会错过任何东西:当你定义的LINQ to SQL查询 ,这样你可以通过调用ToList或ToArray的 扩展方法,其获取数据到一个列表或数组做到这一点。我问如何执行数据,然后执行额外的操作,因为我了解Linq如何工作:)无论如何谢谢你的详细描述! – Tomas 2011-12-28 13:42:35

+0

:-) ....只是添加.ToList()或ToArray(),你很好 – 2011-12-28 13:44:17

+0

@PankajUpadhyay这是'var productsQuery = =(从产品中的p 选择p.ToList();'与代码相同在你的例子中?如果不是,如果我添加一个where子句到你的例子中,它只会提取匹配where子句的结果 – Igor 2014-10-11 17:03:02

3

试试这个第一次声明(注意.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(); 
1

你可以这样做.ToList(),它应该强制执行。