2016-06-17 212 views
0

我有这样的数据表:比较2个数据表

TableObrazkyD:(column name:NAZEV_OBRAZKU) 
    filename1.jpg 
    filename2.jpg 
    filename3.jpg 
    filename4.jpg 
    filename1.jpg 

TableObrazkyFTP:(column name:nazevF) 
    filename1.jpg 
    filename3.jpg 

我想这样的结果:

TableObrazkyRozdil: 
    filename2.jpg 
    filename4.jpg 

我需要比较这2个数据表和行,它错过TableObrazkyFTP写入数据表:TableObrazkyRozdil 现在我试试这个,但是它写了所有的行,不仅错过了行:

var neniNaFTP = TableObrazkyD.AsEnumerable() 
    .Select(r => r.Field<string>("NAZEV_OBRAZKU")) 
    .Except(TableObrazkyFTP.AsEnumerable() 
      .Select(r => r.Field<string>("nazevF"))); 
TableObrazkyRozdil = TableObrazkyD.AsEnumerable() 
    .Where(ra => !TableObrazkyFTP.AsEnumerable() 
       .Any(rb => rb[0] == ra[0])) 
    .CopyToDataTable(); 

你有什么想法吗?

+1

你要检查表包含在同一个地方或相同的数据?我无法理解“comper”下的含义以及你想达到的目标。 –

+0

@D。彼得罗夫:我需要复制表中的所有行:TableObrazkyD,它不在表中:TableObrazkyFTP到新的数据表:TableObrazkyRozdil – Lukas

+0

@Lukas,你有一个重复的值'filename1.jpg'。任一实例是否应包含在结果表中?如果是这样,哪一个? – Charles

回答

0

我想你的意思是你想这样的:

var TableObrazkyRozdil = TableObrazkyD.AsEnumerable() 
             .Where(tbl1 => ! TableObrazkyFTP.Any(tbl2 => tbl1.NAZEV_OBRAZKU == tbl2.nazevF)) 
             .CopyToDataTable(); 

所有表TableObrazkyD。这是不包含表TableObrazkyFTP内。

这将返回:

neniNaFTP:(column name:NAZEV_OBRAZKU) 
    filename2.jpg 
    filename4.jpg 
+0

是的,但我如何写,而不是tbl1.NAZEV_OBRAZKU:tbl1。柱[0]? – Lukas

+0

尝试'tbl1.Columns [0]' – Charles

+0

我尝试,但它不是正确的... – Lukas

1

您可以使用下面一个使用HashSet<string>.Contains快速查找方法:

var ftpNazevF = TableObrazkyFTP.AsEnumerable().Select(r => r.Field<string>("nazevF")); 
var ftpRows = new HashSet<string>(ftpNazevF); 

var neniNaFtpRows = TableObrazkyD.AsEnumerable() 
    .Where(row => !ftpRows.Contains(row.Field<string>("NAZEV_OBRAZKU"))); 
DataTable neniNaFtpTable = null; 
if(neniNaFTPRows.Any()) 
    neniNaFtpTable = neniNaFtpRows.CopyToDataTable(); 

注意CopyToDataTable抛出一个异常,如果没有行,因为它创建了来自序列中第一行的DataTable列。所以你必须检查,如上所示。

+0

只是抬起头来,他的变数名字在Cezch,所以他可能不明白你做得很好。 neniNaFTP从字面上翻译为不在FTP – Charles

+0

@Charles:完成。但我更喜欢让所有人都能理解,不仅仅是捷克语;) –

+0

完全同意,如果你认为这太不透明,可以添加英文评论? – Charles

0

尝试是这样的:

var filesToExclude = TableObrazkyFTP.AsEnumerable() 
          .Select(r => r.Field<string>("nazevF")).ToArray(); 

var TableObrazkyRozdil = TableObrazkyD.AsEnumerable() 
.Except(r => filesToExclude.Contains(r.Field<string>("NAZEV_OBRAZKU"))).CopyToDataTable();