Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net Linq联接共享一列的2个数据表,并将结果放入新的数据表中_Vb.net_Linq_Datatable - Fatal编程技术网

Vb.net Linq联接共享一列的2个数据表,并将结果放入新的数据表中

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| +-----------+------+------+

我有以下数据表

表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|
+-----------+------+------+
表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;
        }

    }
}