11

我有一个实体列表,其中包含一些作为其他实体的字段。

例如。

MyEntity
Int id
ContactEntity Contact -> contactId, Name etc…
AddressEntity Address

所以我有List< MyEntity>哪些需要转换为数据表。但是从子实体中,我只想选择一个字段。

有可能还是我有其他选择。

更新

当我按照 ivowiblo 的描述尝试CopyToDataTable()时,它给了我以下错误

 The type 'AnonymousType#1' cannot be used as type parameter 'T' in the generic type or
 method 'System.Data.DataTableExtensions.CopyToDataTable<T>(System.Collections.Generic.IEnumerable<T>)'.
 There is no implicit reference conversion from 'AnonymousType#1' to 'System.Data.DataRow'.
4

2 回答 2

18

http://msdn.microsoft.com/en-us/library/bb669096.aspx中,他们解释了如何实现一个CopyToDataTable()不需要类型为 DataRow 的方法来处理例如实体。

只需创建一个返回所需架构的查询并使用CopyToDataTable()方法:

var table = entities.Select(x => new {
                                       x.Id,
                                       Contact = x.Contact.Name,
                                       Address = x.Address.Address
                                      }).CopyToDataTable();

此解决方案的唯一问题是它使用反射并且可能会影响性能,具体取决于应用程序的负载。如果您需要避免反射,您将需要创建一个从您的实体显式创建 DataTable 的方法:

var table = new DataTable();

table.Columns.Add("Id", typeof(int))
table.Columns.Add("Contact", typeof(string))
table.Columns.Add("Address", typeof(string))

foreach(var entity in entities) {
    var row = table.NewRow();
    row["Id"] = entity.Id;
    row["Contact"] = entity.Contact.Name;
    row["Address"] = entity.Address.Address;
    table.Rows.Add(row);
}
于 2012-06-22T12:38:07.673 回答
0

试试这段代码(使用 CopyToDataTable 函数):

var query = ....
DataTable dataTable = query.CopyToDataTable();
于 2012-06-22T12:36:55.283 回答