2

我有一个在我的项目中使用过的 WCF。现在我也想在我的其他 Silverlight 项目中使用它。

WCF 设置为根据参数给出的查询返回数据表。它不返回单一类型的数据表,因此我不能仅将其映射到一种类型的对象,返回的数据表的列由作为参数传递的查询定义。

现在我想在我的 silverlight 代码中使用相同的 WCF,我知道我不能将数据表用于 silverlight 项目。因为我必须将此数据表转换为 ienuberable/List 的通用列表/LINQ 对象。

现在我正在使用下面的代码进行从数据表到 IEnumerable 的转换>

var columns = table.Columns.Cast<DataColumn>();
return table.AsEnumerable().Select(r => columns.Select(c =>
                             new { Column = c.ColumnName, Value = r[c] })
                         .ToDictionary(i => i.Column, i => i.Value != DBNull.Value ? i.Value : null));

我只是想听听你们的意见。这是进行对话的最佳方法吗?还请包括内存效率点,因为我的数据表有超过 200k 行。

感谢您抽出时间对此进行调查。

4

1 回答 1

1

在这种情况下,字典的效率非常低,因为对于每一行,您都必须再次保存 Name=Value 对。

一个简单的优化是为每个列存储一个值数组。

像这样的东西:

from c as DataColumn in table.Columns
select new { Column=c.ColumnName, Values = table.Select(r => r[c]).ToArray() }

如果您有一张大桌子,我还建议您实施分页。例如,让您的 WCF 服务方法有一个PageSizeandPageIndex参数。像这样你可以返回前 50 行,然后是下一个,等等。

在任何情况下,您都应该考虑从服务返回 DataTable(无论是否转换)是否真的是一个好主意。接受来自方法的查询然后返回任意结果听起来很危险。为什么没有可以指定过滤器的域特定方法。例如GetCustomers(filter, pageIndex, pageSize). 在过滤器对象中,您可以允许按名称、ID 或您需要的任何内容进行过滤。然后你可以返回一个非常小的对象。

另请参阅有关该主题的以下帖子:

http://www.hanselman.com/blog/PermaLink,guid,d88f7539-10d8-4697-8c6e-1badb08bb3f5.aspx

于 2012-10-06T10:31:55.550 回答