0

顧客のリストを返す関数など、リストを返す関数を備えた WCF サービスがあります。

[OperationContract]
IList<Customer> GetCustomers();

私のASP.NETページは次のことを行うかもしれません:

var top10Customers = Model.GetCustomers().Take(10);
var first10Customers = Model.OrderBy(c => c.ID).Take(10);

次のコードが WCF サービスからすべての Customers を返し、THEN が適用されることを理解していますOrderByTake(10)

特に、WCF サービスが ASP.NET Web サイトとは別のマシンに存在する可能性があるため、データ セット全体を一度に返すのは非効率的です。どのような場合、どのようにして結果セットをページングしたり、LINQ 操作を許可したりできますか?

現時点で確認できる唯一のオプションは、関数にページング オプションを追加することですが、このコードを常に書き直すのは効率が悪いようです。

[OperationContract]
IList<Customer> GetCustomers(int from, int numResults);
4

3 に答える 3

1

最も効率的な SQL を生成するために、パラメーターを GetCustomers メソッドに追加し、その側で LINQ を実行することをお勧めします。

[OperationContract] 
IList<Customer> GetCustomers(int fromRecoard, string orderBy); 

文字列からラムダ式に変換し、Customer のプロパティを使用する必要があるため、order by はちょっとしたトリックになりますが、Web 上にはたくさんのサンプルがあります。

.Net 4.5 の IQueryable の詳細については、OData セクションのこのブログ投稿を参照してください。

http://www.davidhayden.me/blog/asp.net-mvc-4-web-api-routes-and-apicontroller

于 2012-04-12T16:06:34.700 に答える
0

最も効率的な SQL を生成するために、パラメーターを GetCustomers メソッドに追加し、その側で LINQ を実行することをお勧めします。

于 2013-02-12T07:06:54.730 に答える
0
[OperationContract]
IList<Customer> GetCustomers(int from, int numResults);

より非効率的なものは何ですか?いくつかの場所でコードを変更したり、データセット全体をネット経由で送信して 10 行を取得したりしますか?

通常、最適な方法は、LINQ がデータベースに対して最適なクエリを実行できるサービス側にページングを適用することです。サービス sid のページングがそれほど最適化されていない場合でも、少量のデータをコンシューマーに返すことで利益を得ることができます。

並べ替えに関しては、クライアント側で並べ替えを実行できない理由はありません。実際、消費者が好きなように並べ替えることができるようにする必要があると思います。並べ替えによって得られることも失うこともありません。同じ数のレコードが渡され、並べ替えられるかどうかに関係なく渡されます。

于 2012-04-12T14:35:46.473 に答える