web-dev-qa-db-fra.com

Conditions multiples dans EF

Duplicata possible:
Requêtes Linq conditionnelles

Utilisation d'Entity Framework 4.0

J'ai une condition de recherche comme celle-ci

enter image description here

Il existe quatre champs qui permettent aux utilisateurs de filtrer leur recherche. Les conditions sont toutes AND. Le résultat doit omettre le filtre correspondant si la valeur de la zone de texte est String.Empty ou la valeur de la liste déroulante est Tous . Pourrait le faire dans une procédure stockée, mais je ne peux pas du tout imiter cela dans un scénario Linq2SQL/Entity Framework.

Ma question est la suivante, comment omettre IEnumerable.Où dans le Linq selon certaines valeurs entrées?

24
naveen

Vous pouvez enchaîner vos clauses where. Vous avez juste besoin d'une source de données 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....

Puisqu'il s'agit d'IQueryable, les données ne sont pas récupérées tant que vous ne les liez pas, elles ne récupèrent que les données dont vous avez besoin.

43
Slick86

En supposant que l'emplacement et la catégorie sont identifiés dans votre code par des identifiants (id est l'attribut value dans les éléments des zones de liste déroulante), vous pouvez faire quelque chose de similaire à

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

Jetez un oeil à PredicateBuilder . Cela vous permettra de faire quelque chose comme ceci:

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

La manière flexible de procéder consiste à créer la clause where séparément.

This article vous montre comment faire cela. Il faut un peu de travail pour le configurer initialement. Mais ça vaut le coup.

2
Eranga

Vous pouvez faire quelque chose comme ça.

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