簡體   English   中英

使用LINQ對兩個DataTable進行交叉聯接

[英]Cross join on two DataTables using LINQ

我在兩個表上進行交叉聯接時遇到問題。 這是我的代碼:

public DataTable JoinTable(DataTable piTable1, DataTable piTable2)
{
    if (piTable1 == null || piTable2 == null)
        return new DataTable();

    var joinResult = from parent in piTable1.Rows.Cast<DataRow>()
                     from child in piTable2.Rows.Cast<DataRow>()
                     select new {parent, child};

    return joinResult.CopyToDataTable();
}

我得到的結果是兩個DataRowCollection ,但未能將其轉換為DataTable 如何對兩個DataTable進行交叉DataTable

您只需要手動執行:
1)創建結果數據表
2)從兩個表中添加列(請記住,輸入表中的列名稱可能具有保存名稱,因此您需要約定以進行處理-例如包括輸入表名稱或smth)
3)並將值從聯接結果實體復制到相應的列

試試這個

public DataTable JoinTable(DataTable piTable1, DataTable piTable2)
{
    DataTable JoinTable = new DataTable();

    if (piTable1 == null || piTable2 == null)
        return new DataTable();

    var q = from parent in piTable1.AsEnumerable()
                     from child in piTable2.AsEnumerable()
                     select new 
                     {                                                      
                         property1 = parent.Field<T>("PropertyName1"),
                         property2 = parent.Field<T>("PropertyName2"),
                         property3 = child.Field<T>("PropertyName3"),
                         property4 = child.Field<T>("PropertyName4")
                     };

    JoinTable.Rows.Add(q);
    return JoinTable;
}

我使用了下面對我有用的代碼。 我不得不進一步將q in轉換為數組,然后依次轉換為list和table,因為我無法將q直接轉換為table。 以下是可能對某人有用的代碼。

public DataTable JoinTable(DataTable piTable1, string table1Column, 
DataTable piTable2, string table2Column)
{
     DataTable JoinTable = new DataTable();
     JoinTable.Columns.Add(table1Column);
     JoinTable.Columns.Add(table2Column);

        if (piTable1 == null || piTable2 == null)
            return new DataTable();

        var q = from parent in piTable1.AsEnumerable()
                from child in piTable2.AsEnumerable()
                select new
                {
                    table1Column = parent.Field<string>(table1Column),
                    table1Column = child.Field<string>(table2Column),
                };

        JoinTable = ToDataTable((q.ToArray()).ToList());
        JoinTable.TableName = "ResultTable";

        return JoinTable;

    }

    public DataTable ToDataTable<T>(List<T> items)
    {
        DataTable dataTable = new DataTable(typeof(T).Name);
        //Get all the properties
        PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (PropertyInfo prop in Props)
        {
            //Setting column names as Property names
            dataTable.Columns.Add(prop.Name);
        }
        foreach (T item in items)

        {
            var values = new object[Props.Length];
            for (int i = 0; i < Props.Length; i++)
            {
                //inserting property values to datatable rows
                values[i] = Props[i].GetValue(item, null);
            }
            dataTable.Rows.Add(values);
        }
        //put a breakpoint here and check datatable
        return dataTable;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM