C#中如何使用LINQ筛选LastFiles列表中与DbObj列表Type匹配且Id与TypeId一致的元素
使用LINQ筛选符合条件的LastFiles元素
先回顾下你提供的实体类和示例数据:
public class LastFiles { public int Id { get; set; } public string Title { get; set; } public string Author { get; set; } public string Translator { get; set; } public string Supervisor { get; set; } public string Type { get; set; } public string FileName { get; set; } public string ModifiedDate { get; set; } } public class DbObj { public int Id { get; set; } public int WorkId { get; set; } public string Type { get; set; } public int TypeId { get; set; } } // 示例列表实例 var lastFiles = new List<LastFiles> { new LastFiles { Id = 1, Title = "Title 1", Author = "Author 1", Type = "book", FileName = "file-name-1.pdf" }, new LastFiles { Id = 2, Title = "Title 2", Author = "Author 2", Type = "book", FileName = "file-name-2.pdf" }, new LastFiles { Id = 3, Title = "Title 3", Author = "Author 3", Type = "article", FileName = "file-name-3.pdf" }, new LastFiles { Id = 4, Title = "Title 4", Author = "Author 4", Type = "article", FileName = "file-name-4.pdf" }, new LastFiles { Id = 5, Title = "Title 5", Author = "Author 5", Supervisor = "Supervisor 1", Type = "thesis", FileName = "file-name-5.pdf" }, new LastFiles { Id = 6, Title = "Title 6", Author = "Author 6", Supervisor = "Supervisor 2", Type = "thesis", FileName = "file-name-6.pdf" } }; var dbObj = new List<DbObj> { new DbObj { Id = 1, WorkId = 5, Type = "book", TypeId = 1 }, new DbObj { Id = 2, WorkId = 5, Type = "book", TypeId = 2 }, new DbObj { Id = 3, WorkId = 5, Type = "thesis", TypeId = 5 }, new DbObj { Id = 4, WorkId = 5, Type = "thesis", TypeId = 6 }, new DbObj { Id = 5, WorkId = 278, Type = "article", TypeId = 689 } };
要筛选出LastFiles.Type与DbObj.Type相同,且LastFiles.Id与DbObj.TypeId相同的元素,这里有两种实用的LINQ写法:
方法一:使用Join做关联查询
Join是处理集合间关联场景的高效方式,我们可以同时基于Type和Id/TypeId这两个条件来关联两个集合:
var filteredFiles = lastFiles.Join( dbObj, file => new { file.Type, file.Id }, // 定义lastFiles的匹配键:Type和Id obj => new { obj.Type, obj.TypeId }, // 定义dbObj的匹配键:Type和TypeId (file, _) => file // 匹配成功后返回对应的LastFiles元素 ).ToList();
方法二:使用Where结合Any做条件筛选
如果你觉得Join的写法不够直观,也可以用Where遍历lastFiles,同时用Any检查dbObj中是否存在符合双条件的项:
var filteredFiles = lastFiles .Where(file => dbObj.Any(obj => obj.Type == file.Type && obj.TypeId == file.Id)) .ToList();
结果验证
针对你的示例数据,两种方法都会返回以下3个LastFiles元素:
- Id=2(Type=book,匹配dbObj中Id=2的项)
- Id=5(Type=thesis,匹配dbObj中Id=3的项)
- Id=6(Type=thesis,匹配dbObj中Id=4的项)
选择建议
- 如果处理的是大数据量,优先选
Join,它的底层实现更高效,避免了多次遍历集合; - 如果是小数据集,
Where+Any的写法更直白易懂,可读性更高。
内容的提问来源于stack exchange,提问作者Habip Oğuz
相关产品推荐
相关产品推荐

