.Any() 是否进行额外的数据库调用?

问题描述 投票:0回答:2

考虑下面的代码行。

var query = ctx.Db.BannersV2.AsQueryable();
query = query.Where(v => v.IsEnable == true);
query = query.Where(v => (!v.StartdateTime.HasValue || v.StartdateTime <= date.Date) && (!v.EnddateTime.HasValue || v.EnddateTime >= date.Date));
query = query.Where(v => v.BannerType == bannerType);

if (categoryId.HasValue && query.Where(v => v.CategoryId != null).Any())
{
   query = query.Where(v => v.CategoryId == categoryId.Value);
}
if (!location.IsNullOrBlank() && query.Any(v => !string.IsNullOrEmpty(v.Location)))
{
    query = query.Where(v => v.Location.Contains(location));
}
if (!customerGroup.IsNullOrBlank() && query.Any(v => !string.IsNullOrEmpty(v.CustomerGroup)))
{
    query = query.Where(v => v.CustomerGroup.Contains(customerGroup));
}
var result = query?.ToList();

这里我使用 AsQueryable(),然后使用 .Where() 谓词以及 .Any() 谓词。现在我担心或不确定,这个 .Any() 谓词是否会对数据库进行额外的调用?

或者当我使用 .ToList() 或 OrderBy() 或 Select() 时,只有它才会进行额外的数据库调用?

c# linq asp.net-core entity-framework-core linq-to-sql
2个回答
1
投票

Any
是导致查询物化的操作,如
ToList
First
Count
等。因此,如果在像 EF Core 这样的 ORM 之上进行可查询构建,它将导致数据库调用。最简单的检查选项是启用 EF 日志记录并检查输出。例如使用简单日志记录

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder.LogTo(Console.WriteLine);

0
投票

答案是肯定的,

Any
需要去数据库实际确定查询的布尔值,然后可以在应用程序代码中使用该布尔值进行分支。

作为一个有用的经验法则,如果它有一个

Async
对应扩展名,那么它会查询数据库:参见
QueryableExtensions
。如果您使用
async/await
,数据库调用在代码中发生的具体位置也会更加明显。

作为与您的评论相关的第二条有用的经验法则,不要指望随机句子生成器能够提供有关任何内容的事实信息。与 EF 不同,ChatGPT 实际上不会去任何地方验证其命题是否正确,它只是边做边编。

© www.soinside.com 2019 - 2024. All rights reserved.