まず、タイトルが誤解を招く場合は申し訳ありませんが、必要に応じて自由に変更してください。
C#asp.net MVC3WebアプリケーションでLINQtoSQLを使用していますが、機能の1つは、「ユーザー」のコレクションをクエリすることです。データを使用する前に、フィルタリング、並べ替え、およびページングが適用されます。この部分はすべて優れています。この段階で1つのSQLクエリのみが実行されるように構成されています(これはLINQに相当します)。
ただし、私が持っているのは、各「ユーザー」には、ユーザーがそれぞれ1つまたは複数持つことができる、いくつかの関連付けられたテーブル(つまり、アドレス、電子メール、番号)があるということです。ここで、関数の目的で、関連する各テーブル(つまり、「プライマリ」レコード)の最初のエントリを収集する必要があります。私がこれをコーディングした方法は、「フィルタリング」部分で見つかったレコードごとに、各プライマリ詳細レコードをプルするための個別のクエリがあるということです。
この時点で、私がこれをどこに使用するかを皆さんはご存知だと思います。コードの構造を損なうことなく、クエリの数を減らすことはできますか?
それで、次の部分、私のコードはどのように見えますか...
(これはこの質問のために要約されており、コンパイル/実行される場合とされない場合があることに注意してください)
IQueryable<Data.User> users = GetUsers();
users = ApplyFilterSortingPaging(users);//nothing actually executed yet, still building the IQueryable
List<Models.User> results = users.Select(x => x.ToModel());
ここで、ToModel拡張メソッドを確認する必要があります...
public static Models.User ToModel(this Data.User user)
{
Models.User result = new Models.User()
{
Name = user.Name,
PrimaryAddress = user.Addresses.First(),
PrimaryEmail = user.Emails.First(),
PrimaryNumber = user.Numbers.First()
};
}
ご想像のとおり、連絡先レコードごとに、さらに3つのクエリが実行されています。全体として、パフォーマンスは(少なくとも現時点では)問題ではありません-すべてがかなり高速です。これをレコードごとに1つのクエリに減らすためにできることはありますか?または、1つのメインの「すべてのフィルタリングされたレコードと追加のデータを取得する」クエリにさえも?
多分これはより読みやすく/再利用可能なコードのコストですか?