C# 比较数据表和合并更改
我有两个结构相同的数据表A,B。我需要将A的每一行与B的每一行进行比较,结果数据表C应该将A中的行和B中该行的变化放在下面。对于A&B中相同值的行,生成的数据表不应包含这些行 因此,生成的数据表应该在A中有每一行,在B中有不相同的行。结果表不应有相同的行C# 比较数据表和合并更改,c#,datatable,C#,Datatable,我有两个结构相同的数据表A,B。我需要将A的每一行与B的每一行进行比较,结果数据表C应该将A中的行和B中该行的变化放在下面。对于A&B中相同值的行,生成的数据表不应包含这些行 因此,生成的数据表应该在A中有每一行,在B中有不相同的行。结果表不应有相同的行 任何人都可以帮助我使用C代码。最简单的方法是跨数据库联合: create table merged (select * from db1.t) union (select * from db2.t) 只返回唯一的行。要比较记录,请选择共享相同
任何人都可以帮助我使用C代码。最简单的方法是跨数据库联合:
create table merged
(select * from db1.t) union (select * from db2.t)
只返回唯一的行。要比较记录,请选择共享相同键的行。合并的键列将不唯一
select * from merged order by key
按您想要的顺序排列结果
select * from merged where key in
(select key from merged group by key having count(*) > 1)
order by key
将只返回不匹配的行。看起来您想计算两个数据集的行数。我们可以使用一点LINQ、一个相等比较器和一些扩展方法来实现这一点。该代码经过测试并正常工作
class Program
{
static void Main()
{
var a = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Bob", 42}}};
var b = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Carol", 53}}};
var diffs = a.SymmetricDifference(b);
Console.Write(diffs.Rows.Count);
}
}
public static class DataTableExtensions
{
public static DataTable SymmetricDifference(this DataTable a, DataTable b)
{
var diff = a.Clone();
foreach (var person in a.AsPersonList().SymmetricDifference(b.AsPersonList()))
{
diff.Rows.Add(person.FirstName, person.Age);
}
return diff;
}
private static IEnumerable<Person> SymmetricDifference(this IEnumerable<Person> a, IEnumerable<Person> b)
{
return a.SymmetricDifference(b, new PersonComparer());
}
private static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> a, IEnumerable<T> b, IEqualityComparer<T> comparer)
{
return a.Except(b, comparer).Concat(b.Except(a, comparer));
}
private static IEnumerable<Person> AsPersonList(this DataTable table)
{
return table.AsEnumerable().Select(row => row.AsPerson()).ToList();
}
private static Person AsPerson(this DataRow row)
{
return new Person
{
FirstName = row.Field<string>("FirstName"),
Age = row.Field<int>("Age")
};
}
}
public class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person a, Person b)
{
return a.FirstName == b.FirstName && a.Age == b.Age;
}
public int GetHashCode(Person item)
{
return StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.FirstName)
+ StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.Age);
}
}
public class Person
{
public string FirstName;
public int Age;
}
由于这两个数据表来自不同的数据库,我不能使用Sql或Oracle查询进行跨数据库联合。在C.net中有没有实现这一点的方法??一种方法是将数据转储到csv并导入,让sql进行比较的速度最快。我们是否可以直接比较两个数据表并获得所需的结果,而不是将数据转储到csv中??您可以为每个数据库选择所有行到哈希表中,然后比较每一行你需要用C语言还是可以使用工具?