CRM タイプのアプリケーションを開発しています。実装している機能の 1 つは、データのグリッドを表示し、単一のテキスト ボックスを使用して任意の列から値をフィルター処理できるようにすることです。私はかなり醜い解決策を思いつきました (このメソッドも Dynamic Linq を使用してデータを並べ替えることに注意してください) が、おそらくリフレクションを使用して、より「汎用的」にしたいので、WithFiltering 拡張メソッドを呼び出して拡張メソッドにフィルター項を提供します。これは私がこれまでに持っているものです:
public List<PersonModel> GetPeople(int owningOrganisationID, int skip, int records, out int totalCount, Ordering orderByDirection, string filter, string orderBy = "")
{
if (string.IsNullOrEmpty(orderBy))
orderBy = "PersonID";
if (!string.IsNullOrEmpty(filter))
{
filter = filter.ToLower();
totalCount = Context.PeopleView.Where(p => p.OwningOrganisationID == owningOrganisationID &&
p.City.ToLower().Contains(filter)
|| p.CountryName.ToLower().Contains(filter)
|| p.Forename.ToLower().Contains(filter)
|| p.PersonTypeName.ToLower().Contains(filter)
|| p.Postcode.ToLower().Contains(filter)
|| p.Surname.ToLower().Contains(filter)).Count();
return Context.PeopleView.Where(p => p.OwningOrganisationID == owningOrganisationID &&
p.City.ToLower().Contains(filter)
|| p.CountryName.ToLower().Contains(filter)
|| p.Forename.ToLower().Contains(filter)
|| p.PersonTypeName.ToLower().Contains(filter)
|| p.Postcode.ToLower().Contains(filter)
|| p.Surname.ToLower().Contains(filter))
.OrderBy(orderBy + " " + orderByDirection.ToString())
.Skip(skip)
.Take(records)
.ToList();
}
else
{
totalCount = Context.PeopleView.Where(p => p.OwningOrganisationID == owningOrganisationID).Count();
return Context.PeopleView
.Where(o => o.OwningOrganisationID == owningOrganisationID)
.OrderBy(orderBy + " " + orderByDirection.ToString())
.Skip(skip)
.Take(records)
.ToList();
}
}
これは見栄えが悪いだけでなく、エラーが発生しやすく、いくつかの異なるエンティティ (PersonModel、OrganizationModel、DocumentModel など) で同じ種類のコードを使用します。
誰かがよりクリーンなコードについて何か良いアイデアを持っているかどうか疑問に思っていますか?