我使用ADO.NET实体框架,并且经常有这样的代码片段:
List<Sole> entity = soleService.All()
.Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20))
.ToList();
从现在开始,我没有多想太多,只是做了这个检查:
if (entity.Count > 0)
相信这就足够了。现在,我发现很多人都会检查Any()
和null
。如何在某种情况下确定我需要什么样的检查,在这种情况下,正如我所说 - 我经常使用if (entity.Count > 0)
足够吗?
答案 0 :(得分:3)
if (entity.Count > 0)
或if (entity.Any())
相同。由于您已从数据库中获取了所有数据,因此已构建列表并且您知道其大小。所以.Count
属性不会迭代任何东西。
另一方面,如果您没有提取所有数据,请不要调用.Count()
IEnumerable
扩展名,因为它会枚举项目。
改为使用:
bool test = soleService.All()
.Any(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20));
if (test)
{
...
}
此外,LINQ扩展名不会返回null,而是空IEnumerable
,因此请勿检查null
。
答案 1 :(得分:2)
如果您有.ToList()
来电,那么该列表始终是一个列表。也许是空的,但永远不会为空。
检查.Any()
而不是.Count() > 0
是大多数容器或枚举的性能提升,因为.Any()
只会触及第一个元素(如果有)。虽然你对结果不感兴趣,但.Count()
需要通过你的容器计算到最后,只是因为它不是零。
答案 2 :(得分:2)
取决于您的需求。
如果您只想知道任何实体是否与您的谓词匹配,请使用Any()
,因为它会在找到第一个匹配实体后立即返回。
Count() / Count
将需要处理通常会慢得多的所有实体。
也更喜欢Linq的Count()
到列表Count
,因为它不必在内存中创建完整列表,对于大型结果集来说这可能非常昂贵。
答案 3 :(得分:2)
Any()
将提供更好的解决方案,因为它会在首次匹配后停止。
此外
如果ToList()
为真,我建议只执行Any()
。
您将保存(微)表现。
var t = soleService.All() .Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20));
if (t.Any()) entity =t.ToList();
答案 4 :(得分:2)
entity.Any() - 如果您的集合中有任何实体,则返回true。 entities.Count()== 0也会这样做。但我建议使用any,因为它会更快。因为Count将返回集合中的数据量,但任何将触发集合中找到的第一个项目。 但如果您不确定您的收藏集是否已初始化,我建议您使用下一个结构:
if(entity!=null && entity.Any())
{
//Do something. You will get her always without error, And you will be 100% sure that your collection is not empty and it is initialized
}
希望它有所帮助。
答案 5 :(得分:2)
当您拨打if (entity.Count > 0)
但entity == null
时,您会收到例外情况,因为实体未初始化时.Count
不存在。
答案 6 :(得分:2)
当然列表可以是null
或空的。如果您尝试使用上述LINQ创建List<Sole>
并且soleService
可能为null,则在这种情况下您将获得NullReferenceException
。所以我会检查soleService
是不是null
还是先清空。所以
List<Sole> entity = null;
// ...
if (soleService != null && soleService.Count > 0)
entity = soleService.All()
.Where(s => (s.ShoeLastID == shoeLastID) && (s.Status == 20))
.ToList();
我希望这会有所帮助。
答案 7 :(得分:1)
entity.Any()是更好的选择。而且您不需要调用.ToList(),因为这将从数据库中获取所有数据,然后只检查它的计数。