2016-10-04 403 views
-1

我有2个DataTable。一个代表客户,另一个代表CustomerContacts。C#DataTable查找不存在于另一个DataTable中的行

我需要找到所有没有任何CustomerContact行的Customer行。

除了有2个循环,并使用DataViews和FindRows来查找哪些客户没有任何联系人之外,是否有更简单的代码方式?我不熟悉LINQ,不希望将其用于当前项目。

我使用.NET 4.5

我不能直接使用SQL数据库时,因为没有“数据库”。我通过自定义读取Excel文件来填充DataTables。

+0

不是你的问题的答案,但你真的*应该*开始熟悉LINQ。即使是最简单的任务,它也成为标准,并且几乎可以在任何代码库中找到。甚至微软推动它的使用(一个例子是TypeInfo类和它的属性的过滤) – pinkfloydx33

回答

0

可以实现这一点,如下使用LINQ(一个& b为两个数据表)

var query = (from x in a.AsEnumerable() 
      join y in b.AsEnumerable() on x.Field<int>("col1") equals y.Field<int>("col1") 
      select new { col1= y.Field<int>("col1"), col2=x.Field<int>("col2") }).ToList(); 
1

尝试下面的代码。它不使用任何LINQ。将customerID替换为表格的实际Id列。

DataTable Customers = new DataTable();//fill this table from db 
DataTable CustomersContacts = new DataTable();//fill this table from db 
List<string> NoContactCus = new List<string>(); 
foreach (DataRow Customer in Customers.Rows) 
{ 
    DataRow[] contacts = CustomersContacts.Select(string.Format("customerID={0}", Customer["customerID"].ToString())); 
    if (contacts.Count() == 0) 
     NoContactCus.Add(Customer["customerID"].ToString()); 
} 
0

LINQ是你的朋友。

var result = dtCustomers.AsEnumerable().Select(row => (int)row["id"]) 
    .Except(dtCustomerContacts.AsEnumerable().Select(row => (int)row["customerId"])); 


dtCustomersdtCustomerContacts是数据表,
"id""customerId"是主键和外键(假定它们是int),
result是客户ID列表中没有任何接触。

+0

与编写自己的2循环和使用FindRows相比,性能会好还是坏? – AllSolutions

相关问题