【问题标题】:Converting LINQ Join query to DataTable将 LINQ 连接查询转换为 DataTable
【发布时间】:2019-01-15 06:59:59
【问题描述】:

我想将 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.net linq datatable webforms


    【解决方案1】:

    创建以下方法并传递您的 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);
    

    希望这会对你有所帮助。

    【讨论】:

    • 非常感谢,这解决了问题,我犯了另一个错误,我已经解决了。感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多