Множество, где условия в EF
Возможный дубликат:
Условные запросы Linq
Использование Entity Framework 4.0
У меня есть условие поиска, подобное этому
![enter image description here]()
Есть четыре поля, которые позволяют пользователям фильтровать свой поиск. Все условия AND
. Результат должен опустить соответствующий фильтр, если значение текстового поля String.Empty
или значение раскрывающегося списка Все. Это можно сделать в хранимой процедуре, но я не могу имитировать это вообще в сценарии Linq2SQL/Entity Framework.
Мой вопрос в том, как опустить IEnumerable.Where в Linq в соответствии с некоторыми введенными значениями?
Ответы
Ответ 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);
}
Ответ 4
Гибкий способ сделать это - создать предложение where отдельно.
В этой статье показано, как это сделать. Для первоначальной настройки требуется немного работы. Но оно того стоит.
Ответ 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 };
Ответ 6
Я думаю, что Skip While and Take While может помочь в вашей ситуации
http://msdn.microsoft.com/en-us/vcsharp/aa336757#SkipWhileSimple