如何将Int数组传入LINQ操作符获取匹配ID的对象(非循环实现)
嗨,这问题我太熟了!想用LINQ结合数组来匹配ID获取对象,其实用Where加Contains就能轻松搞定,完全不用写for循环,而且效率还更高。
首先,你原来的Select()是不对的,我们需要用Where来做筛选逻辑。直接看修改后的代码吧:
public IEnumerable<ExhibitionPhoto> GetPhotosById(int[] ids) { // 先做个空值判断,避免空数组或null导致的问题 if (ids == null || ids.Length == 0) { return Enumerable.Empty<ExhibitionPhoto>(); } // 核心逻辑:筛选ExhibitionPhotoId在ids数组里的记录 return _db.ExhibitionPhotos.Where(photo => ids.Contains(photo.ExhibitionPhotoId)); }
为什么这么写?
Where是LINQ里的筛选操作符,用来挑出符合条件的元素ids.Contains(photo.ExhibitionPhotoId)会检查当前照片的ID是否存在于你传入的数组中- 更重要的是,EF会把这个LINQ查询转换成SQL的
WHERE ExhibitionPhotoId IN (...)语句,一次数据库查询就能搞定所有匹配项,比循环多次查数据库高效太多了
额外小提示
如果你想立即执行数据库查询(而不是延迟到枚举结果时才执行),可以在末尾加上ToList():
return _db.ExhibitionPhotos.Where(photo => ids.Contains(photo.ExhibitionPhotoId)).ToList();
这种方式会直接把结果加载到内存里,适合需要立即拿到数据的场景。
别忘了处理ids为空的情况哦,不然如果传入null或者空数组,要么会抛出空引用异常,要么会返回整个表的数据,这都不是我们想要的结果。
内容的提问来源于stack exchange,提问作者N'aix
相关产品推荐
相关产品推荐

