2011-06-15 14 views
13

Duplicar posible:
Conditional Linq Queriesmúltiple donde las condiciones de la FE

El uso de Entity Framework 4.0

tengo una condición de búsqueda como esto

enter image description here

Hay cuatro campos que permiten a los usuarios filtrar su búsqueda. Las condiciones son todas AND. El resultado debe omitir el filtro correspondiente si el valor del cuadro de texto es String.Empty o el valor de la lista desplegable es Todos. Podría hacer esto en un Procedimiento almacenado pero no puedo imitar eso en absoluto en un escenario Linq2SQL/Entity Framework.

Mi pregunta es esta, ¿cómo omitir IEnumerable.Where en el Linq de acuerdo con algunos valores introducidos?

+2

http://stackoverflow.com/questions/11194/conditional-linq-queries –

+0

Quiere todas las condiciones, incluido String.Empty | dropdownList.Value! = - 1 condiciones caben en la consulta linq? De lo contrario, puede convertir esto en una condición externa y luego ajustar las condiciones de filtrado en la consulta de linq. – Zenwalker

+0

@mootinator: gracias, actualmente estoy haciendo algo así. ¿Esa es la única salida? – naveen

Respuesta

29

Puede encadenar sus cláusulas where. Solo necesita un origen de datos 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.... 

Debido a que es IQueryable, los datos no es exagerado hasta que ates que por lo que sólo lo hace con los datos que necesita.

+3

también lo hace el múltiple '.Where()' actúa como AND entre el where. Entonces, por ejemplo: 'db.Where (x => xA == true) .Where (x => xB == true)' es lo mismo que 'db.Where (x => xA == true && xB == true) ' – Zapnologica

+4

Cuando encadena Wheres ', siempre se agregan como AND. – Slick86

+5

¿Qué tal el rendimiento? ¿Las condiciones de división en múltiples cláusulas 'where' causan gastos generales? – SepehrM

1

Usted puede hacer algo como esto.

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

Suponiendo que la ubicación y categoría se identifican en su código por los identificadores (id es el atributo de valor en los artículos ComboBoxes), se puede hacer algo similar a

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

La forma más flexible para hacer esto es construir la cláusula where por separado.

This El artículo muestra cómo hacerlo. Se necesita un poco de trabajo para configurarlo inicialmente. Pero vale la pena.

6

Eche un vistazo a PredicateBuilder. Le permitirá hacer algo como esto:

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