繁体   English   中英

Linq to SQL立即执行查询

[英]Linq to SQL execute query immediately

我有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);
}

我认为你在.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;

试试这第一个语句(注意.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()之类的操作,它应该强制执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM