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;
}