繁体   English   中英

将WCF数据表转换为通用/ LINQ对象以供Silverlight使用的最佳方法

[英]best way to convert WCF datatable to generic/LINQ object for silverlight use

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

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

现在我想在我的Silverlight代码中使用相同的WCF,我知道我无法在datalight项目中使用数据表。 因为我必须将此数据表转换为可加密/列表的通用列表/ 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行。

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

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

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

像这样:

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

如果您有大表,我还建议实现分页。 因此,您的WCF服务方法是否具有PageSizePageIndex参数。 这样,您可以返回前50行,然后返回下一行,依此类推。

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

另请参阅以下有关该主题的文章:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM