用linq实现,查询b中含有a表没有的记录,两个表中都有相同的字段身份证号码
可以使用 LINQ 的 Where + Any 或 Contains 来实现。假设两个表对应的实体类都有一个身份证号属性 IdCard,示例如下:
方法一:使用 Where + Any(内存集合)
csharp
var result = b.Where(bItem => !a.Any(aItem => aItem.IdCard == bItem.IdCard)).ToList();
方法二:使用 Where + Contains(先提取 A 的身份证号)
csharp
var aIdCards = a.Select(x => x.IdCard).ToHashSet(); // 使用 HashSet 提高查询性能
var result = b.Where(bItem => !aIdCards.Contains(bItem.IdCard)).ToList();
方法三:查询语法(类似 SQL)
csharp
var result = (from bItem in b
where !(from aItem in a select aItem.IdCard).Contains(bItem.IdCard)
select bItem).ToList();
方法四:使用 GroupJoin 左连接
csharp
var result = (from bItem in b
join aItem in a on bItem.IdCard equals aItem.IdCard into g
where !g.Any()
select bItem).ToList();
如果使用 Entity Framework / LINQ to SQL
直接写:
csharp
var result = db.B.Where(b => !db.A.Any(a => a.IdCard == b.IdCard)).ToList();
// 或
var result = db.B.Where(b => !db.A.Select(a => a.IdCard).Contains(b.IdCard)).ToList();
说明:
以上查询返回的是 B 表中所有身份证号在 A 表中不存在的完整记录。
对于内存集合,推荐先提取 A 的身份证号到 HashSet,这样查询复杂度为 O(n),性能更好。
对于数据库,EF 会自动翻译成 NOT EXISTS 或 NOT IN 子查询,效率取决于索引情况,建议在身份证号字段上建立索引。