Vb.net Linq联接共享一列的2个数据表,并将结果放入新的数据表中
我有以下数据表 表1:Vb.net Linq联接共享一列的2个数据表,并将结果放入新的数据表中,vb.net,linq,datatable,Vb.net,Linq,Datatable,我有以下数据表 表1: +-----------+------+------+ |catalogid | name | snum| +-----------+------+------+ |353 | xx | 4| |364 | yy | 3| |882 | zz | 3| |224毫米71| |999 | kk | 321| |74 | kk | 4| |54 | ii | 5| |11 | u | 6| |23 | yy | 6| +-----------+------+------+
+-----------+------+------+
|catalogid | name | snum|
+-----------+------+------+
|353 | xx | 4|
|364 | yy | 3|
|882 | zz | 3|
|224毫米71|
|999 | kk | 321|
|74 | kk | 4|
|54 | ii | 5|
|11 | u | 6|
|23 | yy | 6|
+-----------+------+------+
表2:
+-----------+----------+--------------+
|catalogid | numitems | ignoreditems|
+-----------+----------+--------------+
| 353 | 4 | 0 |
| 364 | 10 | 0 |
| 882 | 2 | 0 |
| 224 | 0 | 7 |
+-----------+----------+--------------+
我想使用LINQ将它们连接起来,并将结果复制到一个新的数据表中。它们都共享catalogid,结果应该只显示它们的catalogid存在于表2中的记录
结果:
+-----------+------+------+-----------+---------------+
|catalogid | name | snum | numitems | ignoreditems|
+-----------+------+------+-----------+---------------+
|353 | xx | 4 | 4 | 0|
|364 | yy | 3 | 10 | 0|
|882 | zz | 3 | 2 | 0|
|224 |毫米| 71 | 0 | 7|
+-----------+------+------+-----------+---------------+
以下是我的尝试,但不起作用:
Dim query=来自oresult.AsEnumerable中的
在产品中加入b组。A可计算
a.字段(整数的)(“catalogid”)等于b.字段(整数的)(“catalogid”)
分组
query.copytodatatable
CopyToDatatable
不起作用,我不明白为什么CopyToDataRow
只在DataRow的IEnumerable
上起作用。有关任意IEnumerable
s的CopyToDataRow
的实现,请参阅。CopyToDataTable()仅在查询返回IEnumerable时起作用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Common;
namespace TestConsole
{
public class Linq_join_2_datatables_that_share_a_column_and_put_result_in_new_datatable
{
public class Table1
{
public int CatalogId { get; set; }
public string Name { get; set; }
public int SNum { get; set; }
}
public class Table2
{
public int CatalogId { get; set; }
public int NumItems { get; set; }
public int IgnoredItems { get; set; }
}
public static void Start()
{
DataTable table1 = new DataTable();
table1.Columns.Add("catalogid", typeof(int));
table1.Columns.Add("name", typeof(string));
table1.Columns.Add("snum", typeof(int));
DataRow row = table1.Rows.Add(353, "xx", 4);
DataTable table2 = new DataTable();
table2.Columns.Add("catalogid", typeof(int));
table2.Columns.Add("numitems", typeof(int));
table2.Columns.Add("ignoreditems", typeof(int));
table2.Rows.Add(353, 4, 0);
var query = (from t1 in table1.AsEnumerable()
join t2 in table2.AsEnumerable() on t1.Field<int>("catalogid") equals t2.Field<int>("catalogid")
select new
{
catalogid = t1.Field<int>("catalogid"),
name = t1.Field<string>("name"),
snum = t1.Field<int>("snum"),
numitems = t2.Field<int>("numitems"),
ignoreditems = t2.Field<int>("ignoreditems")
}).ToList();
DataTable table3 = query.ConvertToDataTable();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Reflection;
namespace Common
{
public static class DataTableExtensions
{
public static DataTable ConvertToDataTable<T>(this IList<T> data)
{
PropertyDescriptorCollection properties =
TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
foreach (PropertyDescriptor prop in properties)
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
foreach (T item in data)
{
DataRow row = table.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
table.Rows.Add(row);
}
table.AcceptChanges();
return table;
}
}
}