Подтвердить что ты не робот

Множество, где условия в EF

Возможный дубликат:
Условные запросы Linq

Использование Entity Framework 4.0

У меня есть условие поиска, подобное этому

enter image description here

Есть четыре поля, которые позволяют пользователям фильтровать свой поиск. Все условия AND. Результат должен опустить соответствующий фильтр, если значение текстового поля String.Empty или значение раскрывающегося списка Все. Это можно сделать в хранимой процедуре, но я не могу имитировать это вообще в сценарии Linq2SQL/Entity Framework.

Мой вопрос в том, как опустить IEnumerable.Where в Linq в соответствии с некоторыми введенными значениями?

4b9b3361

Ответ 1

Вы можете связать свои предложения. Вам просто нужен источник данных 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, данные не извлекаются до тех пор, пока вы не привяжете их, чтобы они только извлекали нужные вам данные.

Ответ 2

Предполагая, что местоположение и категория идентифицируются в вашем коде с помощью идентификаторов (id - это атрибут value в элементах comboboxes), вы можете сделать что-то похожее на

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)
    );
}
}

Ответ 3

Посмотрите 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);
}

Ответ 5

Вы можете сделать что-то вроде этого.

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