LINQ:加入3个数据表并添加计算字段

时间:2015-10-06 07:18:48

标签: c# linq datatable

我有三张 Datatable 类型的表格:

Table1: Id<Int64>, ParamX<string>;
Table2: Id<Int64>;
Table3: Id<Int64>, ParamA<double>, ParamB<Int16>;

我想通过ID字段加入它们,并使用计算字段ParamC<double>=ParamA<double>*ParamB<Int16>

创建Table4

结果应为数据表

Table4: Id<Int64>, ParamX<string>, ParamA<double>, ParamB<Int16>, ParamC<double>

是否可以在单个LINQ查询中进行? madace

1 个答案:

答案 0 :(得分:2)

您无法在LINQ查询中创建或填充表,查询不应导致副作用。您可以使用LINQ准备要插入新表的数据:

var query = from r1 in Table1.AsEnumerable()
            join r2 in Table2.AsEnumerable()
            on r1.Field<long>("ID") equals r2.Field<long>("ID")
            join r3 in Table3.AsEnumerable()
            on r2.Field<long>("ID") equals r3.Field<long>("ID")
            select new {
                ID = r1.Field<long>("ID"),
                ParamX = r1.Field<string>("ParamX"),
                ParamA = r3.Field<double>("ParamA"),
                ParamB = r3.Field<short>("ParamB"),
                ParamC = r3.Field<double>("ParamA") * r3.Field<short>("ParamB")
            };

var Table4 = new DataTable();
Table4.Columns.Add("ID", typeof(long));
Table4.Columns.Add("ParamX", typeof(string));
Table4.Columns.Add("ParamA", typeof(double));
Table4.Columns.Add("ParamB", typeof(short));
Table4.Columns.Add("ParamC", typeof(double));

使用循环执行查询并将行插入表中:

foreach (var x in query)
{
    DataRow addedRow = Table4.Rows.Add();
    addedRow.SetField("ID", x.ID);
    addedRow.SetField("ParamX", x.ParamX);
    addedRow.SetField("ParamA", x.ParamA);
    addedRow.SetField("ParamB", x.ParamB);
    addedRow.SetField("ParamC", x.ParamC);
}

对于它的价值,这是一种扩展方法,允许通过反射从DataTable创建IEnumerable<anything>

public static class Extensions
{
    public static DataTable ToDataTable<T>(this IEnumerable<T> data)
    {
        PropertyDescriptorCollection props =
            TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        for (int i = 0; i < props.Count; i++)
        {
            PropertyDescriptor prop = props[i];
            table.Columns.Add(prop.Name, prop.PropertyType);
        }
        object[] values = new object[props.Count];
        foreach (T item in data)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = props[i].GetValue(item);
            }
            table.Rows.Add(values);
        }
        return table;
    }
}

然后您无需手动创建或填充表格:

DataTable Table4 = query.ToDataTable();
相关问题