Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在不重新运行查询的情况下运行查询并检查聚合数据?_C#_Linq - Fatal编程技术网

C# 有没有一种方法可以在不重新运行查询的情况下运行查询并检查聚合数据?

C# 有没有一种方法可以在不重新运行查询的情况下运行查询并检查聚合数据?,c#,linq,C#,Linq,在决定枚举LINQ查询的结果集之前,我想查看查询结果计数(可能还有其他聚合数据) 几乎每个LINQ示例都会立即在foreach循环中枚举结果。但我想检查计数以确定是否需要循环遍历每个结果。有没有一种方法可以在不重新运行查询的情况下运行查询并检查聚合数据?如果我做了类似的事情 query.Count() foreach(var item in query) { ... } 我想它将执行两次查询,但不需要再次执行。。。仅枚举Count()中已返回的结果集 查询SQL数据库时,如果需要,通常可以先运

在决定枚举LINQ查询的结果集之前,我想查看查询结果计数(可能还有其他聚合数据)

几乎每个LINQ示例都会立即在foreach循环中枚举结果。但我想检查计数以确定是否需要循环遍历每个结果。有没有一种方法可以在不重新运行查询的情况下运行查询并检查聚合数据?如果我做了类似的事情

query.Count()
foreach(var item in query) { ... }
我想它将执行两次查询,但不需要再次执行。。。仅枚举Count()中已返回的结果集


查询SQL数据库时,如果需要,通常可以先运行单独的聚合查询,然后再运行另一个查询以获取行数据。但是,如果我正确理解LINQ,它将在本地执行相同的操作——相同的循环和逻辑,而无需任何特定的优化——无论我是获得Count()还是执行foreach。是否有一种有效和/或内置的方法来持久化多个操作的结果?

在.NET中,
IEnumerable
序列是惰性的:这意味着只有在需要时才执行底层逻辑。一个副作用是,如果您需要两次结果,那么逻辑将执行两次

例如,如果序列绑定到SQL数据库的结果,那么如果您首先计算元素的数量,然后列出所有元素,那么SQL查询将执行两次

有些LINQ方法只是转换您将得到的结果,而没有实际得到结果。例如,
var b=a,其中(a>0)
不会运行底层逻辑,但会推迟到实际需要结果时再运行

其他LINQ方法有效地强制执行逻辑<例如,code>Count()将强制加载所有元素以对其进行计数
ToArray()
ToList()
也可以这样做,将元素存储在内存中以供进一步使用

您正在寻找的方法完全取决于上下文

通常,您可能希望将序列存储在内存中,例如使用
ToList()
——以便稍后对其执行多个操作,例如计算元素的数量,然后遍历所有元素。另一方面,在某些情况下,您需要其他东西:

  • 底层逻辑的影响可能太大,无法加载内存中的所有内容,迫使您搜索更智能的解决方案。假设您正在进行数据库搜索,并且希望显示结果的数量(比如200000个)以及前20个条目。您真的需要将所有2000 000个结果存储在内存中吗?可能不会

    这里的解决方案是执行
    count
    SQL查询(数据库引擎将能够对其进行优化),然后执行实际查询,获得前20个结果

    一个类似的例子是,当您获得的元素很少时,但需要许多CPU周期才能获得单个元素。有时,当您只需要计算元素时,可以使用快捷方式来缩短复杂的工作

  • 或者可能会发生相反的情况:底层逻辑和数据量太小,无法真正关心。假设您正在处理
    A-Za-z
    范围内的字符。是否确实需要执行
    ToList()
    ?数数,然后分别循环遍历字符不是更容易吗

  • 有时,甚至不可能在内存中存储所有元素。例如,如果您有一个无限序列(例如从不断写入的日志文件中刷新的行),该怎么办

但是,如果我正确理解LINQ,它将在本地执行相同的操作——相同的循环和逻辑,而无需任何特定的优化——无论我是获得Count()还是执行foreach

这完全取决于您使用的ORM。创建LINQ查询时,例如:

var count=this.SequenceFromDatabase
.Where(product=>product.Price>0)
.Count();
foreach(这个.SequenceFromDatabase.Take(10))中的var乘积)
{
...
}
一些(如果不是大多数的话)ORM实际上会将其转化为:

从[Schema].[Table]中选择计数(1),其中[Price]>0
从[Schema].[Table]中选择前10位的[Name]、[Price]、[Availability]

考虑到从LINQ到SQL查询的实际转换取决于您编写的ORM和实际LINQ代码,因此有必要关注正在执行的SQL查询。许多ORM能够跟踪SQL查询,一些SQL引擎也允许您分析查询。

var result=query.ToList();var count=result.count;foreach(结果中的变量项){…}