2010-03-13 19 views
21

Estoy tratando de usar LINQ para devolver una lista de tareas que están en uno de tres estados. Estos estados son:C# - Declaraciones LINQ con cláusulas OR

10 - Completado 11 - Incompleto 12 - omitidos

El estado está disponible a través de una propiedad llamada "TaskStateID". Puedo hacer esto en LINQ con un solo estado, como se muestra aquí:

var filteredTasks = from task in tasks 
        select task; 

// Do stuff with filtered tasks 

string selectedComboBoxValue = GetFilterComboBoxValue(); 
if (selected ComboBoxValue == 3) 
{ 
    filteredTasks = filteredTasks.Where(p => p.TaskStateID == 10); // How do I use an 'OR' here to say p.TaskStateID == 10 OR p.TaskStateID == 11 OR p.TaskStateID == 12 
} 

Como se muestra en el comentario anterior, cómo se utiliza una 'O' en un comunicado LINQ decir p.TaskStateID == 10 o P .TaskStateID == 11 O p.TaskStateID == 12?

Gracias

Respuesta

30

utiliza el OR (||) operador:

filteredTasks = filteredTasks.Where(p => p.TaskStateID == 10 || 
             p.TaskStateID == 11 || 
             p.TaskStateID == 12); 
7

Uso del operador conditional OR:

filteredTasks = filteredTasks.Where(p => p.TaskStateID == 10 || 
             p.TaskStateID == 11 || 
             p.TaskStateID == 12); 
1

muy simple: se utiliza OR lógicas.

filteredTasks.Where(p => p.TaskStateID == 10 || p.TaskStateID == 11 || p.TaskStateID == 12) 

C# lambdas no utilizan un subconjunto del lenguaje C#: utilizan todo el lenguaje. Todo lo posible en C# está disponible para lambdas. El único requisito es que la expresión debe devolver el tipo correcto; e incluso entonces se puede utilizar llaves para abarcar código más complejo:

p => { /* code block that has a return statement here */ } 
1
filteredTasks.Where(p => (p.TaskStateID == 10 || p.TaskStateID == 11 || p.TaskStateID == 12)) 
15
var taskIds = new[]{10, 11, 12} 

var selectedTasks = filteredTasks.Where(p => taskIds.Contains(p.TaskStateID)) 
+0

+1 para mantenimiento! –

+0

Siempre y cuando coloque el operador lambda en el lugar correcto ... ah, y recuerde que esto creará un cierre. –

+0

También solo puede usar Contiene con cadenas. – Hemslingo

2

La forma más sencilla:

.Where(p => p.TaskStateID == 10 || p.TaskStateID == 11 || p.TaskStateID == 12) 

O también se podría hacer algo como esto:

var states = new int[] {10,11,12}; 
filteredTasks = filteredTasks.Join(states, p => p.state, s => s, (p, s) => p); 
Cuestiones relacionadas