C# 将LINQ转换为数据表

C# 将LINQ转换为数据表,c#,linq,datatable,C#,Linq,Datatable,linq查询以{DataRow Job1,DataRow Run}的形式返回结果。如何将JoinResult转换为数据表 var JoinResult = (from Job1 in Jobdata.AsEnumerable() join Product in Productdata.AsEnumerable() on Job1.Field<int>("Job_Id") equals Product.Field&

linq查询以
{DataRow Job1,DataRow Run}
的形式返回结果。如何将
JoinResult
转换为数据表

var JoinResult = (from Job1 in Jobdata.AsEnumerable()
                  join Product in Productdata.AsEnumerable()
                  on Job1.Field<int>("Job_Id") equals Product.Field<int>("Job_Id")
                  join Run in data.AsEnumerable()
                  on Job1.Field<int>("Run_Id") equals Run.Field<int>("Run_Id")
                  select new { Job1, Run });
var JoinResult=(来自Jobdata.AsEnumerable()中的Job1)
将产品加入Productdata.AsEnumerable()中
关于Job1.Field(“Job\u Id”)等于Product.Field(“Job\u Id”)
联接运行入数据。AsEnumerable()
在Job1.Field上(“Run\u Id”)等于Run.Field(“Run\u Id”)
选择new{Job1,Run});

您可以通过循环查询结果来创建新的
数据表

private DataTable createDt()
{
    var JoinResult = (from Job1 in Jobdata.AsEnumerable()
                      join Product in Productdata.AsEnumerable()
                      on Job1.Field<int>("Job_Id") equals Product.Field<int>("Job_Id")
                      join Run in data.AsEnumerable()
                      on Job1.Field<int>("Run_Id") equals Run.Field<int>("Run_Id")
                      select new { Job1, Run });

    DataTable newdt = new DataTable();

    // declare strongly typed data columns
    DataColumn run = new DataColumn("run");
    run.DataType = System.Type.GetType("System.Int32");
    newdt.Columns.Add(run);

    DataColumn job1 = new DataColumn("job1");
    job1.DataType = System.Type.GetType("System.Int32");
    newdt.Columns.Add(job1);


    foreach (var x in JoinResult)
    {
        DataRow dr = newdt.NewRow();
        dr["run"] = x.Run;
        dr["job1"] = x.Job1;
        newdt.Rows.Add(dr);
    }

    return newdt;
}
private DataTable createDt()
{
var JoinResult=(来自Jobdata.AsEnumerable()中的Job1)
将产品加入Productdata.AsEnumerable()中
关于Job1.Field(“Job\u Id”)等于Product.Field(“Job\u Id”)
联接运行入数据。AsEnumerable()
在Job1.Field上(“Run\u Id”)等于Run.Field(“Run\u Id”)
选择new{Job1,Run});
DataTable newdt=新DataTable();
//声明强类型数据列
DataColumn运行=新的DataColumn(“运行”);
run.DataType=System.Type.GetType(“System.Int32”);
newdt.Columns.Add(运行);
DataColumn job1=新的DataColumn(“job1”);
job1.DataType=System.Type.GetType(“System.Int32”);
newdt.Columns.Add(job1);
foreach(JoinResult中的变量x)
{
DataRow dr=newdt.NewRow();
dr[“run”]=x.run;
dr[“job1”]=x.job1;
newdt.Rows.Add(dr);
}
返回newdt;
}
顺便说一句-您不能在您的情况下使用
CopyToDataTable()


但是如果您坚持使用它:

您可以创建一个扩展方法,并按如下方式使用它:

    /// <Summary>
    /// Convert a IEnumerable to a DataTable.
    /// <TypeParam name="T">Type representing the type to convert.</TypeParam>
    /// <param name="source">List of requested type representing the values to convert.</param>
    /// <returns> returns a DataTable</returns>
    /// </Summary>
    public static DataTable ToDataTable<T>(this IEnumerable<T> source)
    {
        // Use reflection to get the properties for the type we’re converting to a DataTable.
        var props = typeof(T).GetProperties();

        // Build the structure of the DataTable by converting the PropertyInfo[] into DataColumn[] using property list
        // Add each DataColumn to the DataTable at one time with the AddRange method.
        var dt = new DataTable();
        dt.Columns.AddRange(
          props.Select(p => new DataColumn(p.Name, BaseType(p.PropertyType))).ToArray());

        // Populate the property values to the DataTable
        source.ToList().ForEach(
          i => dt.Rows.Add(props.Select(p => p.GetValue(i, null)).ToArray())
        );

        return dt;
    }


//To call the above method:
var dt = JoinResult.ToDataTable();
//
///将IEnumerable转换为DataTable。
///表示要转换的类型的类型。
///表示要转换的值的请求类型列表。
///返回数据表
/// 
公共静态数据表ToDataTable(此IEnumerable源)
{
//使用反射获取要转换为DataTable的类型的属性。
var props=typeof(T).GetProperties();
//通过使用property list将PropertyInfo[]转换为DataColumn[]来构建DataTable的结构
//使用AddRange方法一次性将每个DataColumn添加到DataTable。
var dt=新数据表();
dt.Columns.AddRange(
Select(p=>newdatacolumn(p.Name,BaseType(p.PropertyType))).ToArray();
//将属性值填充到数据表中
source.ToList().ForEach(
i=>dt.Rows.Add(props.Select(p=>p.GetValue(i,null)).ToArray()
);
返回dt;
}
//要调用上述方法,请执行以下操作:
var dt=JoinResult.ToDataTable();
注意:只需更新linq查询即可获得IEnumerable数据。
希望它能帮助您。

不清楚(例如,
Jobdata
Product
是否有数据表关系,为什么不使用常规的数据表解决方案?)和广泛。您是否寻找现有的解决方案?这并不是什么新问题。因此,您需要一个
DataTable
,其中每个数据行的列并排排列?但根据这一点,它应该可以工作: