2

マスターデータ

Id 名前
1 CENTRAL
2 EAST
3 EAST CENTRAL
4 EAST COASTAL
5 NORTH
6 NORTH WEST

7 サウス

8 サウスセントラル

9 ウエスト

データを受信しました

Id 名前 値
1 CENTRAL 125.65
5 NORTH 553.21

私は結果が次のようになりたい

Id 名前 値
1 CENTRAL 125.65
2 EAST 0.0
3 EAST CENTRAL 0.0
4 EAST COASTAL 0.0
5 NORTH 553.21
6 NORTH WEST 0.0
7 SOUTH 0.0
8 SOUTH CENTRAL 0.0
9 WEST 0.0

すべてがデータテーブルであることに注意してください。結果を取得するにはどうすればよいですか

4

1 に答える 1

2

DataTableあなたが次のように宣言されているとしましょう:

var dt1 = new DataTable();
dt1.Columns.Add(new DataColumn("Id", typeof(int)));
dt1.Columns.Add(new DataColumn("Name", typeof(string)));

var dt2 = new DataTable();
dt2.Columns.Add(new DataColumn("Id", typeof(int)));
dt2.Columns.Add(new DataColumn("Name", typeof(string)));
dt2.Columns.Add(new DataColumn("Value", typeof(double)));

それに参加して、LINQ to objects で必要なものを取得できます。

var query = from r1 in dt1.AsEnumerable()
            join r2 in dt2.AsEnumerable() on r1.Field<int>("Id") equals r2.Field<int>("Id") into r3
            from r4 in r3.DefaultIfEmpty()
            select new
            {
                Id = r1.Field<int>("Id"),
                Name = r1.Field<string>("Name"),
                Value = r4 == null ? 0.00 : r4.Field<double>("Value")
            };

これで、拡張メソッドを使用してオブジェクトを取り戻すIEnumerable<Anonymous_Type>ことができます:DataTableToDataTable<T>

public static class EnumerableToDataTableConverter
{
    public static DataTable ToDataTable<T>(this IEnumerable<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 newRow = dataTable.NewRow();
            for (int i = 0; i < Props.Length; i++)
            {
                //inserting property values to datatable rows
                newRow[Props[i].Name] = Props[i].GetValue(item, null);
            }
            dataTable.Rows.Add(newRow);
        }
        //put a breakpoint here and check datatable
        return dataTable;
    }
}

次のステートメントでDataTable取得できます。query

var result = query.ToDataTable();
于 2013-04-01T11:01:34.063 に答える