将DataTable转换为IEnumerable<T>以传递给Result<T>(IEnumerable<T> data);

4
我有一个名为Result<T>的对象,它有一个构造函数,接受一个IEnumerable<T>类型的参数。如果可能的话,我想传递一个datatable。
我尝试使用datatable.AsEnumerable(),但是当我将数据绑定到它时,它会抱怨'MyProperty'不是类型'DataRow'上的字段或属性 - 这很有道理,因为'MyProperty'不是'datatable'中的属性,而是其中的一列。
是否有一种方法可以将datatable转换为可传递给Result对象的内容,并仍然使其绑定到gridview?

为什么不直接使用Entity Framework呢? - Akram Shahda
4个回答

3

如果您可以编写一个函数,该函数可以使用单个DataRow构造具有'MyProperty'的对象实例,则可以按如下方式执行:

datatable.AsEnumerable().Select(MyConversionFunction);

2
如果我没记错的话,应该是dtatable.Rows.AsEnumerable()。 - Cylon Cat
@Cylon Cat - 不,实际上并不是 - Joel Mueller

2
我最终使用Linq将datatable转换为一个匿名对象数组。
Dim objs = From row In dt Select New With {
    .Id = row.Field(Of Integer)("Id"),
    .Count = row.Field(Of Integer)("Count")
}

然后我创建了一个通用函数,利用类型推断将匿名对象数组传递到Result对象的构造函数中。

Private Function GetResult(Of T)(ByVal data As IEnumerable(Of T)) As Result(Of T)
    Return New Result(Of T)(Nothing, data)
End Function

使用 Dim result = GetResult(objs) 调用。


1
如果您想将键入的数据表转换为EnumerableRowCollection,可以使用以下方法:
EnumerableRowCollection<YourTypedRow> typedRowCollection = datatable.AsEnumerable().Cast<YourTypedRow>();

1

这个怎么样?

table.Rows.Cast<DataRow>()

那会有什么作用呢?你不还是会遇到同样的问题吗?“MyProperty”不会成为DataRow实例上的属性。 - adam0101
好的,那会给你行,你确实可以访问每一行的每一列,例如在一个for each循环中,代码应该是For Each row As DataRow In rows Dim val = row("MyProperty") Next - bottlenecked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接