web-dev-qa-db-ja.com

EFの複数のwhere条件

可能性のある複製:
条件付きLinqクエリ

Entity Framework 4.0の使用

このような検索条件があります

enter image description here

ユーザーが検索をフィルターできる4つのフィールドがあります。条件はすべてANDです。テキストボックスの値がString.Emptyの場合、またはドロップダウンリストの値がAllの場合、結果は対応するフィルターを省略しなければなりません。ストアドプロシージャでこれを行うことはできますが、Linq2SQL/Entity Frameworkシナリオではまったく模倣できません。

私の質問はこれです、IEnumerableを省略する方法です。いくつかの入力値に従ってLinqのどこに?

24
naveen

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であるため、バインドするまでデータはフェッチされないため、必要なデータのみがプルされます。

43
Slick86

場所とカテゴリがコードで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)
    );
}
}
8
Lucian

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句を個別に作成することです。

これ の記事はその方法を示しています。最初に設定するには少し手間がかかります。でも、その価値はある。

2
Eranga

このようなことができます。

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 };
1
Jits