基本上我有一个DataSet,其中包含2个DataTables。 DataTables不共享公共密钥或字段,但它们的行索引相关。我已经尝试了MSDN示例http://msdn.microsoft.com/en-us/library/bb386921(v=vs.110).aspx中的以下代码,但因为它们没有共享一个公共字段,所以我无法正确加入它们,所以我尝试使用两个FROM连接来加入表格知道错了。这就是我所拥有的:
public DataTable buildEmployeeDataTable(DataSet ds)
{
DataTable personIdentity = ds.Tables["PersonIdentity"];
DataTable person = ds.Tables["Person"]; ;
var query = (
from pi in personIdentity.AsEnumerable()
from p in person.AsEnumerable()
select new
{
PersonKey = pi.Field<string>("PersonKey"),
PersonNumber = p.Field<string>("PersonNumber"),
FullName = p.Field<string>("FullName")
}).ToList();
DataTable dataTable = ConvertToDataTable(query);
return dataTable;
}
它有点有效,但却改为:
PersonKey PersonNumber FullName
1 42 Bob
1 62 Jon
1 57 Tom
2 42 Bob
2 62 Jon
2 57 Tom
3 42 Bob
3 62 Jon
3 57 Tom
我是否需要将结果存储在另一个DataTable中并运行SelectMany(p =&gt; p).Distinct()?连接这些表的正确方法是什么,以便查询通过其人员密钥返回每个人?非常感谢:)
答案 0 :(得分:1)
如果您知道这两个表格的排序正确,并且所有记录都正确匹配,那么您可以将它们拼接在一起:
var identities = personIdentity.AsEnumerable();
var persons = person.AsEnumerable();
var query = identities.Zip(persons, (pi, p) => new
{
PersonKey = pi.Field<string>("PersonKey"),
PersonNumber = p.Field<string>("PersonNumber"),
FullName = p.Field<string>("FullName")
})
.ToList();
答案 1 :(得分:0)
我发现这是解决我遇到的问题的另一种方式:
public DataTable buildEmployeeDataTable(DataSet ds)
{
DataTable personIdentity = ds.Tables["PersonIdentity"];
DataTable person = ds.Tables["Person"]; ;
var query = (
from pi in personIdentity.AsEnumerable()
join p in person.AsEnumerable()
on personIdentity.Rows.IndexOf(pi) equals
person.Rows.IndexOf(p)
select new
{
PersonKey = pi.Field<string>("PersonKey"),
PersonNumber = p.Field<string>("PersonNumber"),
FullName = p.Field<string>("FullName")
}).ToList();
DataTable dataTable = ConvertToDataTable(query);
return dataTable;
}
我想知道这和Zip之间有什么区别吗?感谢您的帮助!