比较两个数据表并使用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_code
和b_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.";
如果您需要过滤掉两个异常,最简单的方法是将两个.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的帖子,特别注意Select
和Except
的帖子,你应该明白LINQ是如何很好地工作来完成你需要的。