C# Linq到对象-查询将执行多少次?
我有以下Linq到对象查询:C# Linq到对象-查询将执行多少次?,c#,linq,C#,Linq,我有以下Linq到对象查询: var query = this._vaporizerData .Where(row => row.Coater == coater) .Where(row => row.Distributor == distributor) .Where(row => row.PowerTubeA.HasValue); if (query.Any()) { tubeA = query .Where(row =&g
var query = this._vaporizerData
.Where(row => row.Coater == coater)
.Where(row => row.Distributor == distributor)
.Where(row => row.PowerTubeA.HasValue);
if (query.Any())
{
tubeA = query
.Where(row => row.CoaterTime.Value >= readTime.AddMinutes(-5))
.Where(row => row.CoaterTime.Value <= readTime)
.OrderByDescending(row => row.CoaterTime)
.Select(row => row.PowerTubeA)
.First()
.Value;
}
var query=this.\u
.其中(行=>行.涂布机==涂布机)
.Where(行=>行.分发服务器==分发服务器)
.Where(row=>row.powertube.HasValue);
if(query.Any())
{
tube=查询
.Where(row=>row.CoaterTime.Value>=readTime.AddMinutes(-5))
.Where(row=>row.CoaterTime.Value row.CoaterTime)
.Select(行=>row.powertube)
.First()
价值
}
我知道在执行query.Any()行时,会计算第一个Linq查询。我的问题是。假设第一个查询的结果是5行数据。当我执行第二个查询(从'tubeA=query'开始)时,是否正确?它将仅根据第一个查询返回的五行对其进行计算
非常感谢。第二个查询不使用第一个查询的结果。 因此,您使用两个查询来命中对象。1用于
.Any()
,1用于.First()
如果要重用第一次查询的结果而不再次命中对象,请使用ToList()
,如下所示:
var query = this._vaporizerData
.Where(row => row.Coater == coater)
.Where(row => row.Distributor == distributor)
.Where(row => row.PowerTubeA.HasValue).ToList();
这将在
查询中存储第一个查询结果,否则查询不包含任何值,但实际上是一个用于进行查询的语句。第二个查询不使用第一个查询的结果。
因此,您使用两个查询来命中对象。1用于.Any()
,1用于.First()
如果要重用第一次查询的结果而不再次命中对象,请使用ToList()
,如下所示:
var query = this._vaporizerData
.Where(row => row.Coater == coater)
.Where(row => row.Distributor == distributor)
.Where(row => row.PowerTubeA.HasValue).ToList();
这将把第一个查询结果存储在查询
中,其他方面的查询
不包含任何值,但实际上是进行查询的语句
我知道在执行query.Any()行时,会计算第一个Linq查询
嗯,有点。只要有必要,就会对其进行评估。因此,如果在\u perdata
中有一百万行,但第一行与过滤器匹配,那么它不会遍历其余的数据
当我执行第二个查询(从'tubeA=query'开始)时,是否正确?它将仅根据第一个查询返回的五行对其进行计算
是的,但它必须再次找到这些行,并根据第一次不匹配的所有行检查筛选器。因此,同样,如果在\u perdata
中有一百万行,但这次只有最后一行与原始查询匹配,那么您将再次检查所有999999个不匹配的行
此外,如果在调用Any()
和调用First()
之间,有任何其他内容更改了\u-erdata
的内容,那么这些更改将是可见的,因为它实际上会返回到原始数据源
最好只执行一次查询,例如
var minTime = readTime.AddMinutes(-5); // Avoid recalculation
var result = this._vaporizerData
.Where(row => row.Coater == coater)
.Where(row => row.Distributor == distributor)
.Where(row => row.PowerTubeA.HasValue);
.Where(row => row.CoaterTime.Value >= minTime)
.Where(row => row.CoaterTime.Value <= readTime)
.OrderByDescending(row => row.CoaterTime)
.Select(row => row.PowerTubeA)
.FirstOrDefault();
if (result != null)
{
tubeA = result.Value;
}
var minTime=readTime.AddMinutes(-5);//避免重新计算
var结果=此数据
.其中(行=>行.涂布机==涂布机)
.Where(行=>行.分发服务器==分发服务器)
.Where(row=>row.powertube.HasValue);
.Where(row=>row.CoaterTime.Value>=minTime)
.Where(row=>row.CoaterTime.Value row.CoaterTime)
.Select(行=>row.powertube)
.FirstOrDefault();
如果(结果!=null)
{
tubeA=结果值;
}
编辑:评论中指出的两个要点:
- 如果第一个查询与某个项匹配,而第二个不匹配,则原始查询将引发异常;上面的代码将以
result
作为null结束。这可能是你的问题,也可能不是
- 如果使用,可以通过使用
.MaxBy(row=>row.CoaterTime)
而不是使用OrderByDescending
和First
来提高效率。IIRC,这将在空输入时失败,因此只有当您首先使用原始版本的
,而不是上面的版本时,才应该这样做
我知道在执行query.Any()行时,会计算第一个Linq查询
嗯,有点。只要有必要,就会对其进行评估。因此,如果在\u perdata
中有一百万行,但第一行与过滤器匹配,那么它不会遍历其余的数据
当我执行第二个查询(从'tubeA=query'开始)时,是否正确?它将仅根据第一个查询返回的五行对其进行计算
是的,但它必须再次找到这些行,并根据第一次不匹配的所有行检查筛选器。因此,同样,如果在\u perdata
中有一百万行,但这次只有最后一行与原始查询匹配,那么您将再次检查所有999999个不匹配的行
此外,如果在调用Any()
和调用First()
之间,有任何其他内容更改了\u-erdata
的内容,那么这些更改将是可见的,因为它实际上会返回到原始数据源
最好只执行一次查询,例如
var minTime = readTime.AddMinutes(-5); // Avoid recalculation
var result = this._vaporizerData
.Where(row => row.Coater == coater)
.Where(row => row.Distributor == distributor)
.Where(row => row.PowerTubeA.HasValue);
.Where(row => row.CoaterTime.Value >= minTime)
.Where(row => row.CoaterTime.Value <= readTime)
.OrderByDescending(row => row.CoaterTime)
.Select(row => row.PowerTubeA)
.FirstOrDefault();
if (result != null)
{
tubeA = result.Value;
}
var minTime=readTime.AddMinutes(-5);//避免重新计算
var结果=此数据
.其中(行=>行.涂布机==涂布机)
.Where(行=>行.分发服务器==分发服务器)
.Where(row=>row.powertube.HasValue);
.Where(row=>row.CoaterTime.Value>=minTime)
.Where(row=>row.CoaterTime.Value row.CoaterTime)
.Select(行=>row.powertube)
.FirstOrDefault();
如果(结果!=null)
{
tubeA=结果值;
}
编辑:评论中指出的两个要点:
- 如果第一个查询与项匹配,但
F, F, F, F, F, F, F, F, F, F, F, F, T, F, T, F, F, F