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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/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# 在调用ToList()或Count()之前检查LINQ Where()是否返回任何内容_C#_Linq - Fatal编程技术网

C# 在调用ToList()或Count()之前检查LINQ Where()是否返回任何内容

C# 在调用ToList()或Count()之前检查LINQ Where()是否返回任何内容,c#,linq,C#,Linq,我想知道我是否会这样做: var results = source.Where(c => c.Name == "Whatever"); 在调用Count()或ToList()之前,是否有方法检查查询是否返回了任何内容?我知道()在哪里懒洋洋地执行 返回的数据集可能很大,调用上述方法非常耗时 结果也从不为空 谢谢。当然,只要使用任何工具,它会告诉您是否有任何结果 results.Any(); 根据MSDN: 此方法不返回集合的任何一个元素。相反,它确定集合是否包含任何元素。 一旦确定结果

我想知道我是否会这样做:

var results = source.Where(c => c.Name == "Whatever");
在调用Count()或ToList()之前,是否有方法检查查询是否返回了任何内容?我知道()在哪里懒洋洋地执行

返回的数据集可能很大,调用上述方法非常耗时

结果也从不为空


谢谢。

当然,只要使用任何工具,它会告诉您是否有任何结果

results.Any();
根据MSDN:

此方法不返回集合的任何一个元素。相反,它确定集合是否包含任何元素。 一旦确定结果,源的枚举将立即停止


知道查询是否会返回内容的唯一方法是执行该查询。因此,您可以获取结果或检查结果计数/存在性但在第二种情况下,您不能确定进一步执行查询是否会产生相同的结果

样本:

List<int> items = new List<int>() { 1, 2, 3 };
var query = items.Where(i => i > 0);
// query is not executed at this point
var count = query.Count(); // first execution, returns 3
items.Clear();
var positiveItmes = query.ToList(); // ooop, no items here!
List items=newlist(){1,2,3};
var query=items.Where(i=>i>0);
//此时不执行查询
var count=query.count();//第一次执行,返回3
items.Clear();
var positiveTimes=query.ToList();//哦,这里没有东西!
因此,如果您确信数据不会在查询之间更改(是吗?完全?),则可以在获取所有数据之前使用
Count()
Any()
。在其他情况下,您必须使用类似于
ToList()
的内容加载数据


FirstOrDefault将作为SELECT TOP 1(LinqToSql)执行

,因为您只想知道是否值得获得完整的结果集—这永远不值得

这里只有两种情况:

  • 您的查询没有结果。在这种情况下,检查有多少个结果的查询执行的时间和返回的信息与实际查询的时间完全相同。在这种情况下,你什么也得不到(但也没有损失)

  • 您的查询至少有一个结果。在这种情况下,您需要返回并执行真正的查询。最终的结果是,您花费的时间与不先检查的时间一样多,但是您还需要额外的成本来检查是否有结果。该检查意味着到数据库的往返,这是一个不平凡的时间量

  • 如果您想知道查询是否包含任何项,那么这是可能的。(只需使用
    Any
    扩展方法。)但是,只有当您不需要知道实际项目是什么,而不管
    Any
    的结果是什么时,这才是有益的


    同样值得注意的是,正如LaZyBeeZovSkyin所做的那样,您还需要考虑在调用“<代码> < < /代码> > < /p> < p>查询结果的竞争条件下,谢谢有用的建议和精确性。我最终在我的通用EF存储库中实现了这一点:

        public bool CheckExists(string tableName, string whereField, string whereValue)
        {
            string query = string.Format("SELECT COUNT(*) FROM {0} WHERE {1} = {2}", tableName, whereField, whereValue);
            var count = _context.ExecuteStoreQuery<int>(query).FirstOrDefault();
            if (count == 0)
                return false;
            else
                return true;
        }
    
    public bool CheckExists(字符串tableName、字符串whereField、字符串whereValue)
    {
    string query=string.Format(“从{0}中选择COUNT(*),其中{1}={2}”,tableName,whereField,whereValue);
    var count=_context.ExecuteStoreQuery(query.FirstOrDefault();
    如果(计数=0)
    返回false;
    其他的
    返回true;
    }
    

    快多了!:)我仍在执行一个查询,但由于我没有要求LINQ/EF将可能的结果转换为复杂类类型的IENumerable,所以看起来还可以。

    听起来您应该实现skip并接受查询以限制返回数据集。查看“延迟执行”。在您需要查询中的某些内容之前,查询不会运行。如果您认为可能没有任何内容,例如使用Take扩展方法,那么您可能需要尝试一个较小的查询。我无法理解您的问题。如果
    source
    为空,则不,调用
    Count
    ToList
    不会增加计算
    source
    的开销,如果您想知道
    source
    是否为空,您无论如何都会这样做。不会有()是否仍在执行查询?@Bnicoll-如果不先执行查询,就无法知道查询是否会返回任何结果。这将执行查询。如果
    source
    IQueryable
    ,它将在存在的地方执行
    。Any()
    将不会执行查询——它可能会执行一个提供布尔结果的查询。不一样。如果您总是在真实的查询为真时执行真实的查询,那么使用它就没有意义了。你什么都没存。如果没有数据,那么获取真正的查询将非常快(因为没有数据)。如果它在那里,你无论如何都在做,所以你只是增加了不检查的开销。这永远不是一个净胜利。1)仍然在执行查询2)请至少使用
    任何
    注释?数据集永远不会通过连接发送,如果有任何结果可用,您将得到一个答案。如另一个答案所述,如果您要在任何项目存在时提取整个数据集,则您没有保存任何内容,因为您仍在进行大查询,如果没有项目,那么执行真正的查询将与此操作一样快。@Magnus好吧,这应该可以完成这项工作(我认为它属于*的一部分,如果您确定数据在查询之间不会更改),但锁定范围很重。对于捕获,我给出的+1表示获得零行或计数等于零之间没有区别
    
        public bool CheckExists(string tableName, string whereField, string whereValue)
        {
            string query = string.Format("SELECT COUNT(*) FROM {0} WHERE {1} = {2}", tableName, whereField, whereValue);
            var count = _context.ExecuteStoreQuery<int>(query).FirstOrDefault();
            if (count == 0)
                return false;
            else
                return true;
        }