考虑下面的代码行。
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() 时,只有它才会进行额外的数据库调用?
答案是肯定的,
Any
需要去数据库实际确定查询的布尔值,然后可以在应用程序代码中使用该布尔值进行分支。
作为一个有用的经验法则,如果它有一个
Async
对应扩展名,那么它会查询数据库:参见 QueryableExtensions
。如果您使用 async/await
,数据库调用在代码中发生的具体位置也会更加明显。
作为与您的评论相关的第二条有用的经验法则,不要指望随机句子生成器能够提供有关任何内容的事实信息。与 EF 不同,ChatGPT 实际上不会去任何地方验证其命题是否正确,它只是边做边编。