You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core如何查询属性值存在于子列表中的数据库记录

EF Core 按实体列表Id匹配查询的实现方案

你现有写法存在两个问题:

  • 第一种写法用的a.Id in ...不是C# LINQ支持的合法语法,仅能在原生SQL中使用
  • 第二种写法的animals.Contains(a.Id)类型不匹配,animals是List<Animal>类型,存储的是Animal实体,无法直接匹配Id字段

标准实现方案

首先先提取待匹配的Id集合:

// animals 为传入的 List<Animal> 类型参数
List<int> matchIds = animals.Select(x => x.Id).ToList();

然后执行LINQ查询,EF Core会自动将该表达式翻译为SQL IN语法:

List<Animal> listFromDb = _dbContext.Animals
    .Where(a => matchIds.Contains(a.Id))
    .ToList();

注意事项

  • 该写法兼容EF Core 3.0及所有更高版本,生成的原生SQL逻辑和预期的IN查询完全一致
  • 如果待匹配的Id数量超过2000,建议分批查询避免SQL参数过多导致性能下降,示例如下:
const int batchSize = 1000;
List<Animal> result = new List<Animal>();
for (int i = 0; i < matchIds.Count; i += batchSize)
{
    var currentBatch = matchIds.Skip(i).Take(batchSize).ToList();
    var batchData = _dbContext.Animals.Where(a => currentBatch.Contains(a.Id)).ToList();
    result.AddRange(batchData);
}

如果需要用EXISTS语法实现,等效写法如下,性能和IN写法基本一致:

var listFromDb = _dbContext.Animals
    .Where(a => matchIds.Any(id => id == a.Id))
    .ToList();

内容的提问来源于stack exchange,提问作者Paul DeVito

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:48:03