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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:58:11