实体列表转换为数据表格

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'.

2个回答

18

http://msdn.microsoft.com/en-us/library/bb669096.aspx中,他们解释了如何实现不需要类型为DataRow的CopyToDataTable()方法,以便与实体等进行操作。

只需创建一个返回所需模式的查询,并使用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);
}

我发现Marc Gravell的FastMember库非常适用于这个任务。请参考相关问题以了解如何完成此操作。 - Marc.2377
@Marc.2377,关于使用FastMember的完整示例,你有什么想法吗? - Kiquenet
@Kiquenet,请查看问题下的评论中的链接。 - Marc.2377

-1
尝试使用以下代码(包括CopyToDataTable函数):
var query = ....
DataTable dataTable = query.CopyToDataTable();

1
是的,我已经看过了http://msdn.microsoft.com/en-us/library/bb669096.aspx,问题是我在实体内有子实体,我只需要从中提取一个字段。 - huMpty duMpty
这并不是像问题所问的那样将“一系列实体”转换过来。 - undefined

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