可能性のある複製:
条件付きLinqクエリ
Entity Framework 4.0の使用
このような検索条件があります
ユーザーが検索をフィルターできる4つのフィールドがあります。条件はすべてAND
です。テキストボックスの値がString.Empty
の場合、またはドロップダウンリストの値がAllの場合、結果は対応するフィルターを省略しなければなりません。ストアドプロシージャでこれを行うことはできますが、Linq2SQL/Entity Frameworkシナリオではまったく模倣できません。
私の質問はこれです、IEnumerableを省略する方法です。いくつかの入力値に従ってLinqのどこに?
Where句を連鎖させることができます。 IQueryableデータソースが必要なだけです。
var filteredData = _repository.GetAll();
//If your data source is IEnumerable, just add .AsQueryable() to make it IQueryable
if(keyWordTextBox.Text!="")
filteredData=filteredData.Where(m=>m.Keyword.Contains(keyWordTextBox.Text));
if(LocationDropDown.SelectedValue!="All")
filteredData=filteredData.Where(m=>m.Location==LocationDropDown.SelectedValue));
... etc....
IQueryableであるため、バインドするまでデータはフェッチされないため、必要なデータのみがプルされます。
場所とカテゴリがコードでIDによって識別されると仮定すると(IDはコンボボックス項目の値属性です)、次のようなことができます
function GetItems(string keyword, string consultant, int? locationId, int categoryId){
using(MyContextEntities context = new MyContextEntities()){
return context.Items.Where(item =>
(string.IsNullOrEmpty(keyword) || item.Text.Contains(keyword))
&& (string.IsNullOrEmpty(consultant) || item.Consultant.Contains(consultant))
&& (!locationId.HasValue || item.Location.Id == locationId.Value)
&& (!categoryId.HasValue || item.Category.Id == categoryId.Value)
);
}
}
PredicateBuilder を見てください。それはあなたがこのようなことをすることを可能にします:
IQueryable<??> SearchProducts (params string[] keywords)
{
var predicate = PredicateBuilder.True<??>();
foreach (string keyword in keywords)
{
string temp = keyword;
if(temp != String.Empty || temp != "All")
predicate = predicate.And(e => e.???.Contains (temp));
}
return dataContext.??.Where (predicate);
}
これを行う柔軟な方法は、where句を個別に作成することです。
これ の記事はその方法を示しています。最初に設定するには少し手間がかかります。でも、その価値はある。
このようなことができます。
var abc = from al in myEntity.a
where (field == string.Empty ? al.field == string.Empty : al.field == field)
select new { al.field1, al.field2, al.field3 };