それぞれのアプローチに長所と短所がある高度な検索を実装するために、2 つの異なる方法を使用しています。
ユーザーは、3 つのパラメーター (名前、姓、携帯電話) を使用して高度な検索を実行できます。
私が試した最初の方法は、これらのパラメーターのどれがユーザーによって提供されているかを確認することです。これには、8 if
&else
チェック (2 ^ パラメーター数) を実行する必要があり、各条件で、対応するパラメーターを受け入れる個別のクエリを作成します。たとえば、ユーザーが名前と姓を入力した場合、クエリの where 句は次のようになります。これ:
where(x=>x.name.contains(name) && x.familyname.contains(familyname))
または別のケースで、ユーザーがモバイルのみを入力した場合、クエリの where 句は次のようになります。
where(x=>x.mobile==mobile)
この方法の利点は、データベースに一度アクセスすることですが、欠点は、より多くのコードを書かなければならないことです。
私が試した2番目の方法は、IQueryable<>
オブジェクトを宣言し、最初は条件なしでデータをそれにフィードし、次に検索パラメータを1つずつチェックし、それらのいずれかに値がある場合はその値でフィルタリングしIQueryable
、最後に.ToList()
. この方法には、コードがはるかに少ないという利点がありますが、データベースに 2 回ヒットするという問題があります。
2 番目の方法のコード サンプルを次に示します。
List<ShoppingCardForGridView> list_ShoppingCardForGridView =
new List<ShoppingCardForGridView>();
IQueryable<ShoppingCardForGridView> outQuery =
from x in db.ShoppingCards
orderby x.TFDateBackFromBank descending
where x.TFIsPaymentCompleted == true
select new ShoppingCardForGridView
{
Id = x.Id,
TFCustomerFullName =
x.Customer.TFName + " " + x.Customer.TFFamilyName,
TFDateBackFromBank = x.TFDateBackFromBank.Value,
TFIsDelivered = x.TFIsDelivered,
TFItemsPriceToPay = x.TFItemsPriceToPay,
TFDateBackFromBankPersian = x.TFDateBackFromBankPersian
};
if (!string.IsNullOrEmpty(CustomerFullName))
{
outQuery = outQuery.Where(x =>
x.TFCustomerFullName.Contains(CustomerFullName));
}
if (!string.IsNullOrEmpty(IsDelivered))
{
bool deliveryStatus = Convert.ToBoolean(IsDelivered);
outQuery = outQuery.Where(x => x.TFIsDelivered == deliveryStatus);
}
list_ShoppingCardForGridView = outQuery.ToList();
entityframework を使用して高度な検索を実行するためのより良い方法またはベスト プラクティスがあるのだろうか?