Closed TokugawaTakeshi closed 1 year ago
Entity frameworkは意外とシンプルに実データを要求された時のみデータベースにアクセスします。
具体的にはDbContextに対してLINQを使い、欲しいデータだけを取得していきます。
//例:10件スキップした先の20件分データを取得する方法
var data = PeopleModels.Skip(10).Take(20).ToArray();
イメージとしては、LINQ文がそのままSQL文になっていると思って良いと思います。
@gummoni
いかがですか?
public Task<IPersonGateway.SelectionRetrieving.ResponseData> RetrieveSelection(
IPersonGateway.SelectionRetrieving.RequestParameters requestParameters
)
{
List<PersonModel> filteredItems;
if (String.IsNullOrEmpty(requestParameters.FilteringByName))
{
filteredItems = _dataBaseContext.PeopleModels.ToList();
}
else
{
filteredItems = _dataBaseContext.PeopleModels.Where(
personModel => personModel.Name.Contains(requestParameters.FilteringByName)
).ToList();
}
return Task.FromResult(new IPersonGateway.SelectionRetrieving.ResponseData(
totalItemsCount: (uint)_dataBaseContext.PeopleModels.Count(),
totalItemsCountInSelection: (uint)filteredItems.Count,
selectionItemsOfSpecifiedPaginationPage: filteredItems.
Skip((int)(requestParameters.PaginationPageNumber * requestParameters.ItemsCountPerPaginationPage)).
Take((int)requestParameters.ItemsCountPerPaginationPage).
Select(_ => (Person)_).ToList())
);
}
個人的に気に成っている事は
if (requestParameters.FilteringByName.Length > 0)
だと、例外が投げられる恐れがあります。どうすれば良いですか?if (requestParameters.FilteringByName?.Length > 0)
で良いですか?1つ目の文字が空か判定する時の書き方は
if (!String.IsNullOrEmpty(requestParameters.FilteringByName))
とすると良いです。
2つ目のListの処理速度ですが、C#の実装はうまく良くできているので配列型とList型で大幅な速度差はないので 最適化するタイミングでList型からArray形に変える方法で良いかもしれません。 もし、Arrayにする場合は、ToListをToArrayに代えるだけでOKです。
@gummoni
御説明、有難う。
RetrieveSelectionは以上です。
RetrieveSelection
メソッドは、モックゲートウェイも場合は実装は下記通りでした。
PersonLocalEF_SQLiteGateway
内同じメソッドを実装する上で、データベースとの取引の数を最少化しなければいけないでしょう。最適化を考慮している実装の案内に就いては案内を待っています。