【发布时间】:2018-09-27 21:09:44
【问题描述】:
我最近一直在研究我的网络应用程序性能,发现了一些 LINQ 查询,我不确定更改它们是否会提高性能。
目前的代码基本上是这样的:
var result = _carsRepository.GetAll()
.Where(x => x.Name == input.Name)
.FirstOrDefault();
if (result != null)
{
throw new Exception("test");
}
我正在考虑将其更改为:
var result = _carsRepository.GetAll()
.Where(x => x.Name == input.Name)
.Any();
if (result)
{
throw new Exception("test");
}
在我的理解中,第一个查询将返回一个实际的实体,我不需要它,因为我只想知道同名的记录是否已经存在于数据库中。第二个查询只返回一个布尔值。
我会感谢任何 cmets。
编辑:我可以在 EF db 上下文中运行查询,所以请忽略它。 当前存储库是一个通用的 Abp.Domian.Repository。 GetAll() 返回 IQueryable
【问题讨论】:
-
一般经验法则:测试两者,获得基准。避免过早的优化,仅当这已被确定为应用程序的性能瓶颈时才关心。
-
您可能会从数据库中提取 100000000 条记录,然后再执行
where,如果没有,您可能需要索引Name -
@Saruman: index or not on Name 与此问题无关,因为
Where在两个查询中完全相同。 -
@TimSchmelter 你是对的,但我只是在猜测,在我继续下一个问题之前
-
除非明确确定为瓶颈(通过测量),否则性能很少是更改代码的好理由。在这种情况下更改代码的更好理由是使用
.Any()的版本更清楚地表达了您正在做的事情的意图。
标签: c# linq entity-framework-core