Linq to SQL立即执行查询

本文关键字:执行 查询 to SQL Linq | 更新日期: 2023-09-27 18:19:07

我有Linq查询,并希望立即执行它,然后操作数据。现在在下面的代码中,执行第一个(1)Linq查询时执行第二个(2)Linq查询。我想首先执行第一(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);
}

Linq to SQL立即执行查询

我想你错过了。net中数据操作的一个重要概念

延迟读取和立即读取

需要强调的重要一点是,默认情况下,LINQ to SQL从对象中检索数据只有当您请求数据库时,而不是当您定义LINQ to SQL查询或创建一个表集合。这就是所谓的延迟抓取。

当foreach循环开始时,LINQ to SQL创建并运行派生的SQL SELECT语句从LINQ到SQL查询创建ADO。. NET数据读取器对象。的每次迭代foreach循环执行必要的GetXXX方法来获取该行的数据。后最后一行已经被foreach循环获取和处理,LINQ to SQL关闭数据库连接。

延迟获取确保只从应用程序实际使用的数据中检索数据库。但是,如果您正在访问运行在远程SQL实例上的数据库服务器端,逐行提取数据并不能充分利用网络带宽。在这个场景中,您可以通过强制立即获取和缓存单个网络请求中的所有数据LINQ到SQL查询的求值。您可以通过调用ToList或ToArray来实现这一点扩展方法,在定义LINQ to SQL时将数据获取到列表或数组中查询,如下所示:

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

尝试第一个语句(注意.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();

您可以执行类似. tolist()的操作,它应该强制执行。