首页 > 解决方案 > 将 LINQ 连接查询转换为 DataTable

问题描述

我想将 LINQ Join 查询结果转换为我检查过但找不到任何真实解决方案的 DataTable。

我尝试了两种方法1:

var query = from A in ABC.AsEnumerable()
                        join X in XYZ.AsEnumerable()
                        on A.Field<int>("A-ID") equals
                        X.Field<int>("X-ID")
                        where ((A.Field<string>("A-Column1") == "1")
                        && (r.Field<string>("X-Column1") == "1"))
                        select new
                        {
                            UserName = ABC.Field<string>("UserName"),
                            UserExperience = XYZ.Field<string>("UserExperience"),
                            ...
                        };

2:

DataTable dt = new DataTable();
            dt.Columns.Add("UserName", typeof(string));
            dt.Columns.Add("UserExperience", typeof(string));

var query = from A in ABC.AsEnumerable()
                        join X in XYZ.AsEnumerable()
                        on A.Field<int>("A-ID") equals
                        X.Field<int>("X-ID")
                        where ((A.Field<string>("A-Column1") == "1")
                        && (r.Field<string>("X-Column1") == "1"))
                        select dt.LoadDataRow(new object[]
                        {
                            ABC.Field<string>("UserName"),
                            XYZ.Field<string>("UserExperience"),
                            ...
                        }, false);

    DataTable ddt = new DataTable();

    ddt = query.CopyToDataTable();

但这两者都无法解决我的问题。

我想将该结果转换为 DataTable / DataSet。

提前致谢。

标签: c#asp.netlinqdatatablewebforms

解决方案


创建以下方法并传递您的 LINQ 查询返回的任何类型的对象。

public static DataTable CreateDataTableFromAnyCollection<T>(IEnumerable<T> list)
    {
        Type type = typeof(T);
        var properties = type.GetProperties();

        DataTable dataTable = new DataTable();
        foreach (PropertyInfo info in properties)
        {
            dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
        }

        foreach (T entity in list)
        {
            object[] values = new object[properties.Length];
            for (int i = 0; i < properties.Length; i++)
            {
                values[i] = properties[i].GetValue(entity,null);
            }

            dataTable.Rows.Add(values);
        }

        return dataTable;
    }

并传递您的 LINQ 结果,例如

DataTable dt = CreateDataTableFromAnyCollection(list);

希望这会帮助你。


推荐阅读