1

2 つのテーブルでクロス結合を行う際に問題があります。これが私のコードです:

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();
}

結果を 2 つDataRowCollectionの として取得していますが、同じものを に変換できませんDataTable。2 つの s でクロス結合を行うにはどうすればよいDataTableですか?

4

3 に答える 3

0

手動で行う必要があるだけです:
1)結果のDataTableを作成します
2)両方のテーブルから列を追加します(入力テーブルの列名には名前が保存されている可能性があることに注意してください。入力テーブル名を含めるか、 smth)
3) 結合結果エンティティから対応する列に値をコピーします

于 2012-11-29T07:39:28.223 に答える
0

この方法を試してください

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;
}
于 2012-11-29T14:08:45.363 に答える
0

私は私のために働いた以下のコードを使用しました。q をさらに配列に変換し、次にリストしてからテーブルに変換する必要がありました。これは、q をテーブルに直接キャストできなかったためです。以下は、誰かに役立つコードです。

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;
    }
于 2017-11-23T13:16:33.560 に答える