转换/转换ISingleResult - 在没有循环的情况下将值列表到DataTable

时间:2010-10-07 07:49:42

标签: c# linq datatable dataset

我正在使用 Linq to Sql 。当我 StoredProcedure 执行其结果时,ll以 IMultipleResults 的形式返回。

我将其转换为 ISingleResults ,它可以作为列表

所以我需要将其转换为DataTable 以便我可以将其绑定到数据集将值传递给UI。

但我想要这样的方法,我可以转换它而不用LOOP

请任何人帮助我。

任何澄清请与我联系。

感谢你。

1 个答案:

答案 0 :(得分:0)

首先,您可能想看看是否可以将列表转换为BindingList,或者执行以下操作:

BindingListX = New BindingList(Of elementX)(QueryResult.ToList())

您可能能够与之绑定。如果这不起作用,虽然这里有另一个问题:你想不在代码中使用循环,或者只是在代码中看不到循环?可以创建一个执行转换的扩展函数:

public static class HelperFunctions
    {
        public static void Map<T>(this IEnumerable<T> source, Action<T> func)
        {
            foreach (T i in source)
                func(i);
        }

        public static DataTable ToDataTable<T>(this IEnumerable<T> source)
        {
            var dt = new DataTable();
            var properties = typeof(T).GetProperties();
            dt.Columns.AddRange(properties.Select(x => new DataColumn(x.Name, x.PropertyType)).ToArray());
            source.Select(x => dt.NewRow().ItemArray = properties.Select(y => y.GetValue(x, null)).ToArray()).Map(x => dt.Rows.Add(x));
            return dt;
        }
    }

但正如您所看到的,另一个扩展函数“Map”只不过是一个可以内联使用的foreach。如果那不是你想要的,那么我道歉并试图想出一个不同的方式。

值得注意的是,我不确定分配给Item Array是否是填充行的最佳方式,所以如果它不起作用,请告诉我,以便我可以起草另一个版本的函数。

希望这有帮助!