2

プロジェクトで使用したWCFが1つあります。今度は、他のSilverlightプロジェクトでも使用したいと思います。

WCFは、パラメーターで指定されたクエリに従ってデータテーブルを返すように設定されています。単一のタイプのデータテーブルを返さないため、単一のタイプのオブジェクトにのみマップすることはできません。返されるデータテーブルの列は、パラメーターとして渡されるクエリによって定義されます。

今、Silverlightコードで同じWCFを使用したいのですが、データテーブルをSilverlightプロジェクトに使用できないことを知っています。このデータテーブルをienuberable/Listのジェネリックリスト/LINQオブジェクトに変換する必要があるため。

現在、以下のコードを使用して、datatableから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サービスメソッドにPageSizePageIndexパラメーターを設定します。このように、最初の行、たとえば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 に答える