C# 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

我有以下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 => 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