比较两个数据表并使用2个条件选择不在第二个表中的行

本文关键字:选择 条件 第二个 2个 两个 数据表 比较 | 更新日期: 2023-09-27 18:11:29

我需要一个事务表的这个函数。我的数据表是这样的。

RecordsInDatabase-Table

a_code | b_code
AB     | 001
AB     | 002
AC     | 001

RecordsInTextFile-Table

a_code | b_code
AB     | 002
AC     | 005
AC     | 009

我需要使用两个id, a_codeb_code进行比较。因此,如果我运行LINQ代码(或其他),一个数据表将包含在数据库中,但不在文本文件中的记录。

RecordsNotInTextFile-Table

a_code | b_code
AB     | 001
AC     | 001

我已经有一个LINQ代码,但它只比较使用一个ID。

DataTable affixesInDatabase = affixDAO.SelectAllAffix();
            IEnumerable<string> affixesNotInTextFile = affixesInDatabase.AsEnumerable().Select(r => r.Field<string>("affix_code"))
                .Except(affixesInTextFile.AsEnumerable().Select(r => r.Field<string>("affix_code")));
            if (affixesNotInTextFile.Any())
            {
                DataTable affixesToBeDeleted = (from row in affixesInDatabase.AsEnumerable()
                                                join id in affixesNotInTextFile
                                                on row.Field<string>("affix_code") equals id
                                                select row).CopyToDataTable();
                foreach (DataRow dr in affixesToBeDeleted.Rows)
                {
                    affixDAO.DeleteAffix(dr[0].ToString());
                }
            }
            return "Affix data successfully edited.";

比较两个数据表并使用2个条件选择不在第二个表中的行

如果您需要过滤掉两个异常,最简单的方法是将两个.Except()调用链接到您的LINQ表达式中。

从你的评论来看,你似乎不熟悉LINQ的工作原理。如果您想了解,我建议您阅读Jon Skeet的"Edulinq"系列,他在其中重新实现了标准的LINQ查询操作符,并解释了它是如何工作的。但这里是简短的版本:

LINQ是操作可枚举序列的扩展方法集合。IEnumerable<T>)。每种方法都以一个序列作为输入并应用一些操作,其中大多数方法产生一个新的序列作为输出。(有一些会产生单个值,但不是我们正在处理的。)这就是你的查询所做的:

IEnumerable<string> affixesNotInTextFile = //assignment. You know how that works
affixesInDatabase //our base sequence that we're starting from
.AsEnumerable() //ensure that we're working with an IEnumerable, not an IQueryable
.Select() //transform the sequence from the original objects to a sequence of Field<string> values from the original objects
.Except() //filter out of the transformed sequence anything that's in *this* sequence

Except()产生一个新的序列,因此您可以在表达式的末尾链接另一个.Except(),以进一步过滤该序列。阅读Edulinq的帖子,特别注意SelectExcept的帖子,你应该明白LINQ是如何很好地工作来完成你需要的。